1 solutions
-
0
C++ :
#include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> #include<iomanip> using namespace std; void preprocess(int weight); struct Node{ int l,r; }; const int SIZE=200005; Node node[SIZE]; int n,counter[SIZE],wei[SIZE],value[SIZE]; double total[SIZE]; int main(){ double interval,min_dis,tmp; double standard; int left,right; cin>>n>>interval>>standard; double sum=0; int maximum=-1; for(int i=1;i<=n;i++){ scanf("%d%d",&wei[i],&value[i]); maximum=max(wei[i],maximum); sum+=value[i]; } min_dis=sum*n; for(int i=1;i<=interval;i++){ scanf("%d%d",&node[i].l,&node[i].r); //node[i].l--; node[i].r--; } left=0; right=maximum; //进行二分查找 while(left<=right){ //cout<<"left: "<<left<<" right: "<<right<<endl; int middle=(left+right)/2; //动态规划,O(n)的时间完成预处理 preprocess(middle); tmp=0; for(int i=1;i<=interval;i++){ tmp+=(counter[node[i].r]-counter[node[i].l-1])*(total[node[i].r]-total[node[i].l-1]); } //所选的重量越大,检验量就会越大,毫无意义 if(tmp>standard) left=middle+1; else if(tmp<standard) right=middle-1; else if(tmp==standard){ min_dis=standard; break; } if(fabs(tmp-standard)<fabs(min_dis-standard)) min_dis=tmp; //if((tmp>=standard&&tmp<min_dis)||(tmp<standard&&tmp>min_dis)) // min_dis=tmp; //cout<<"middle: "<<middle<<" min_dis "<<min_dis<<endl; } if(min_dis>standard) cout<<fixed<<setprecision(0)<<min_dis-standard<<endl; else cout<<fixed<<setprecision(0)<<standard-min_dis<<endl; //system("pause"); return 0; } void preprocess(int weight){ counter[0]=0; total[0]=0; if(wei[1]>=weight){ counter[1]=1; total[1]=value[1]; } else{ counter[1]=0; total[1]=0; } for(int i=2;i<=n;i++){ if(wei[i]>=weight){ counter[i]=counter[i-1]+1; total[i]=total[i-1]+value[i]; } else{ counter[i]=counter[i-1]; total[i]=total[i-1]; } } return; }Pascal :
var s,y,tmp,ans:int64; mid,left,right,i,n,m,max,min:longint; c,a,w,v,l,r:array[0..200001]of longint; procedure work(t:longint); var i:longint; count,tot:int64; begin fillchar(a,sizeof(a),0); fillchar(c,sizeof(c),0); for i:=1 to n do begin if w[i]>=t then begin a[i]:=a[i-1]+v[i]; c[i]:=c[i-1]+1; end else begin a[i]:=a[i-1]; c[i]:=c[i-1]; end; end; y:=0; for i:=1 to m do begin count:=c[r[i]]-c[l[i]-1]; tot:=a[r[i]]-a[l[i]-1]; y:=y+count*tot; end; end; begin read(n,m,s); max:=0; min:=maxlongint-1; for i:=1 to n do begin read(w[i],v[i]); if w[i]>max then max:=w[i]; if w[i]<min then min:=w[i]; end; for i:=1 to m do begin read(l[i],r[i]); end; left:=min-1;right:=max+1; ans:=maxlongint*100000; while left<right do begin mid:=(left+right) div 2; work(mid); tmp:=s-y; if abs(tmp)<ans then ans:=abs(tmp); if ans=0 then break; if s>y then right:=mid else left:=mid+1; end; writeln(ans); end.
- 1
Information
- ID
- 16868
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By