题目描述
blablabla
样例
blablabla
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度分析:blablabla
C++ 代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 200010
typedef pair<long,long> PLL;
PLL kuangshi[N];
PLL section[N];
long long sum[N]; //保存矿石总价值的前缀和数组
long cnt[N]; //保存满足重量要求的矿石总数量的数组
long long getY(long W,long n,long m)
{
int i;
long long Y=0;
for(i=1;i<=n;i++)
{
if(kuangshi[i].first>=W)
{
sum[i]=sum[i-1]+kuangshi[i].second;
cnt[i]=cnt[i-1]+1;
}
else
{
sum[i]=sum[i-1];
cnt[i]=cnt[i-1];
}
}
for(i=1;i<=m;i++) //求不同W值时的前缀和
{
Y+=(sum[section[i].second]-sum[section[i].first-1])*(cnt[section[i].second]-cnt[section[i].first-1]);
}
return Y;
}
int main()
{
long n,m,l,r,w,v,W,i,j,ans,mid;
long long S;
cin>>n>>m>>S;
for(i=1;i<=n;i++)
{
cin>>w>>v;
kuangshi[i].first=w;
kuangshi[i].second=v;
}
for(i=1;i<=m;i++)
{
cin>>l>>r;
section[i].first=l;
section[i].second=r;
}
l=0;
r=1e6+1;
while(l<r) //二分出get(W)大于等于S的最小的Y
{
mid=(l+r+1)/2;
if(getY(mid,n,m)>=S) //Y增大,W减小
{
l=mid;
}
else //Y增大,W减小
{
r=mid-1;
}
}
ans=min(abs(getY(l,n,m)-S),abs(getY(l+1,n,m)-S));
cout<<ans;
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度分析:blablabla
C++ 代码
blablabla
UHHH.....................................