2 条题解

  • 0
    @ 2025-10-8 17:01:56

    正解 by harenz:

    #include <bits/stdc++.h>
    const int N=25010;
    using namespace std;
    typedef long long ll;
    bool debug1;
    int n;
    int c[N],a[N],b[N];
    struct node{
        int job,id,key;
    } d[N];
    bool debug2;
    bool cmp(node x,node y){
        return x.key<y.key;
    }
    int main(){
        scanf("%d", &n);
        for(int i=1; i<=n; i++){
            scanf("%d%d", &a[i], &b[i]);
            d[i].id=i;
            if(a[i]<b[i]){
                d[i].job=1;
                d[i].key=a[i];
            }else
                d[i].key=b[i];
        }
        sort(d+1, d+n+1, cmp);
        ll j=1, k=n;
        for(int i=1; i<=n; i++)
            if(d[i].job)
                c[j++]=d[i].id;
            else
                c[k--]=d[i].id;
        j=a[c[1]];
        k=j+b[c[1]];
        for(int i=2; i<=n; i++){
            j+=a[c[i]];
            if(j<k)
                k+=b[c[i]];
            else
                k=j+b[c[i]];
        }
        printf("%lld", k);
        return 0;
    }
    

    错解 by hansang:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;const int N=25e3+10;
    struct node{LL x, y;} a[N];
    bool cmp(node n1, node n2){
        LL t1=n1.x+max(n2.x, n1.y)+n2.y;
        LL t2=n2.x+max(n1.x, n2.y)+n1.y;
        return t1<t2;
    }
    int main(){
        int n; scanf("%d", &n);
        for(int i=1; i<=n; i++) scanf("%lld%lld", &a[i].x, &a[i].y);
        sort(a+1, a+n+1, cmp);
        LL ans=0, s1=0, s2=0;
        for(int i=1; i<=n; i++){
            s1+=a[i].x;
            if(s2<s1) s2=s1;
            s2+=a[i].y;
        }
        printf("%lld\n", max(s1, s2));
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:01:41

      by harenz(正解):

      #include <bits/stdc++.h>
      const int N=25010;
      using namespace std;
      typedef long long ll;
      bool debug1;
      int n;
      int c[N],a[N],b[N];
      struct node{
      	int job,id,key;
      } d[N];
      bool debug2;
      bool cmp(node x,node y){
      	return x.key<y.key;
      }
      int main(){
      //	freopen("data.in","r",stdin);
      //	freopen("my.out","w",stdout);
      //	cout<<((&debug2-&debug1)/1024.0/1024.0)<<endl;
      	scanf("%d",&n);
      	for(int i=1;i<=n;i++){
      		scanf("%d%d",&a[i],&b[i]);
      		d[i].id=i;
      		if(a[i]<b[i]){
      			d[i].job=1;
      			d[i].key=a[i];
      		}else
      			d[i].key=b[i];
      	}
      	sort(d+1,d+n+1,cmp);
      	ll j=1,k=n;
      	for(int i=1;i<=n;i++)
      		if(d[i].job)
      			c[j++]=d[i].id;
      		else
      			c[k--]=d[i].id;
      	j=a[c[1]];
      	k=j+b[c[1]];
      	for(int i=2;i<=n;i++){
      		j+=a[c[i]];
      		if(j<k)
      			k+=b[c[i]];
      		else
      			k=j+b[c[i]];
      	}
      	printf("%lld",k);
      	return 0;
      } 

      by hansang(错解):

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=25e3+10;
      struct node{LL x, y;} a[N];
      bool cmp(node n1, node n2){
          LL t1=n1.x+max(n2.x, n1.y)+n2.y;
          LL t2=n2.x+max(n1.x, n2.y)+n1.y;
          return t1<t2;
      }
      int main(){
          int n; scanf("%d", &n);
          for(int i=1; i<=n; i++) scanf("%lld%lld", &a[i].x, &a[i].y);
          sort(a+1, a+n+1, cmp);
          LL ans=0, s1=0, s2=0;
          for(int i=1; i<=n; i++){
              s1+=a[i].x;
              if(s2<s1) s2=s1;
              s2+=a[i].y;
          }
          printf("%lld\n", max(s1, s2));
          return 0;
      }
      • 1

      USACO(29)贪心进阶3:二道工序P6243 [USACO06OPEN] The Milk Queue G

      信息

      ID
      2626
      时间
      1000ms
      内存
      128MiB
      难度
      9
      标签
      递交数
      39
      已通过
      2
      上传者