3 条题解

  • 1
    @ 2024-5-15 21:12:28
    #include <bits/stdc++.h>
    #define ll long long
    #define db double
    #define cr char
    #define scd(x) scanf("%d",&x)
    #define prd(x) printf("%d",x)
    #define prl() printf("\n")
    #define prsp() printf(" ")
    #define rep(i,x,y) for(int i=x;i<=y;i++)
    using namespace std;
    ll n,n1,n2,v,x,y,yu1[30100],yu2[30100],f[60100],l1[60100],l2[60100];
    int main(){
        cin>>n>>v;
        for(int i=1;i<=n;i++){
            cin>>x>>y;
            if(x==1) yu1[++n1]=y;
            else yu2[++n2]=y;
        }
        sort(yu1+1,yu1+n1+1);
        sort(yu2+1,yu2+n2+1);
        l1[1]=n1;
        l2[0]=l2[1]=n2;
        f[1]=yu1[n1];
        l1[1]--;
        for(int i=2;i<=v;i++){
            if(f[i-2]+yu2[l2[i-2]]>=f[i-1]+yu1[l1[i-1]]){
                l2[i]=l2[i-2]-1;
                l1[i]=l1[i-1];
                f[i]=f[i-2]+yu2[l2[i-2]];
            }
            else{
                l2[i]=l2[i-2];
                l1[i]=l1[i-1]-1;
                f[i]=f[i-1]+yu1[l1[i-1]];
            }
        }
        cout<<f[v];
    	return 0;
    }
    
    • 1
      @ 2022-6-18 14:43:16
      #include <bits/stdc++.h>
      using namespace std;
      #define int long long
      int read()
      {
      	char ch=getchar();
      	int x=0,m=1;
      	while(!isdigit(ch)){
      		if (ch=='-') m=-1;
      		ch=getchar();
      	}
      	while(isdigit(ch)){
      		x=x*10+ch-'0';
      		ch=getchar();
      	}
      	return x*m;
      }
      void write(int x)
      {
      	if (x<0) putchar('-'),x=-x;
      	if (x>=10) write(x/10);
      	putchar(x%10+'0');
      }
      int n=read(),v=read(),mid,ans;
      struct Node{
      	short x;
      	int y;
      }a[30010];
      bool cmp(Node x,Node y)
      {
      	return x.x < y.x || (x.y > y.y && x.x == y.x);
      }
      signed main()
      {
      	for (int i=1;i<=n;i++){
      		a[i].x=read();
      		a[i].y=read();
      		if (a[i].x==1) mid++;
      	}
      	sort(a+1,a+1+n,cmp);
      	int i=0,j=mid;
      	while(i<mid&&i<v) ans+=a[++i].y;
      	while(j<n&&i+(j-mid+1<<1)<=v) ans+=a[++j].y;
      	while(i>=2&&j<n&&a[i].y+a[i-1].y<=a[j+1].y) ans+=a[++j].y-a[i--].y-a[i--].y;
      	if (i<mid&&i+(j-mid<<1)<v) ans+=a[++i].y;
      	write(ans); 
      	return 0;
      }
      
      • 0
        @ 2022-7-29 20:06:13
        
        
        
        #include<bits/stdc++.h>
        using namespace std;
        long i,n,m,s,a,b[30005],o,o1,c[30005],k,j;
        bool cmp(long x,long y)
        {
        	return x>y;
        }
        void main()
        {
        	cin>>n>>m;
        	for(i=1;i<=n;i++)
        	{
        		cin>>a;
        		if(a>1)cin>>b[++o];
        		else cin>>c[++o1];
        	}
        	sort(b+1,b+o+1,cmp);
        	sort(c+1,c+o1+1,cmp);
        	i=j=1;
        	while(m)
        	{
        		if(m>1)
        		{
        			if(b[i]<c[j]+c[j+1])s+=c[j]+c[j+1],j+=2;
        			else s+=b[i],i++;
        			m-=2;
        		}
        		else{
        			s+=c[j];
        			j++;
        			m--;
        		}
        	}cout<<s;
        	return;
        }
        • 1

        信息

        ID
        32
        时间
        1000ms
        内存
        256MiB
        难度
        7
        标签
        (无)
        递交数
        92
        已通过
        22
        上传者