50分求助大佬!!!超时了(ToT) 不知道为什么
查看原帖
50分求助大佬!!!超时了(ToT) 不知道为什么
1024853
sana_37楼主2023/8/1 19:06
#include<iostream>
#include<math.h>
using namespace std;
int N;//矿石个数
int M;//区间个数
long long S;//标准值
long long mini;
typedef struct Stone
{
    int wight;
    int val;
};
typedef struct QuJian
{
    int begin;
    int end;
};
long long y = 0;
bool Cheak(int W,QuJian*brr,Stone*arr)
{
    y = 0;
   
    for (int i = 0; i < M; i++)
    {
       
        long long val_1 = 0;
        long long val_2 = 0;
        for (int j = brr[i].begin; j <= brr[i].end; j++)
        {
            val_1 += (arr[j].wight >= W);
            val_2 += (arr[j].wight >= W) * arr[j].val;
        }
        y += val_1 * val_2;
       
    } 
   
    if (abs(S - y) < mini)mini = abs(S - y);
    if (y > S)
    {
       
        return true;
    }
    else return false;
    


    
    
}
int main()
{
    cin >> N >> M >> S;

    mini = 1e12;

    Stone* arr = new Stone[N + 1];
    QuJian* brr = new QuJian[M];

    for (int i = 1; i <= N; i++)cin >> arr[i].wight >> arr[i].val;
    for (int i = 0; i < M; i++)cin >> brr[i].begin >> brr[i].end;

   

    long long l = 0;
    long long r = S;

    while (l <= r)
    {
        long long mid = (r + l) /2; 
      
        if (Cheak(mid, brr, arr))
        {
            
           l = mid + 1;
         
        }
        else
        {  
            r = mid - 1;
        }
        
    }
    
    cout << mini << endl;
    return 0;

}

2023/8/1 19:06
加载中...