1 solutions

  • 0
    @ 2025-11-5 15:30:37

    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