2009-04-25 07:08:43來源不明

ACM 10954 10954 Add All

Greedy

每做一次加總 就做一次排列 拿最小的相加

最下面的程式碼為4XXms (因為多餘的指令  造成1.2秒)

/********1.2S的作法 太慢了*********************************/

#include<stdio.h>
#include<stdlib.h>
main()
{
 int n,m;
 while(scanf("%d",&n)==1&&n!=0)
   {
    int number[100001]={0},mm=n,time=0;
     while(n--)
       {
        scanf("%d",&m);
        number[m]++;
       }
    long long int line[100001]={0};
    int a,b,c,top=0;
    for(a=1;a<=100000;a++)
     if(number[a]!=0)
      for(b=0;b<number[a];b++)
       {line[top]=a;top++;}
    long long int ans=0,sum,temp;
    mm=top ;
    for(a=0;a<mm-1;a++)
     {
      sum=line[a+1]+line[a];
      ans+=sum;
      line[a+1]+=line[a];
       for(b=a+1;b<mm-1;b++)
        if(line[b]>line[b+1]) {temp=line[b+1];line[b+1]=line[b];line[b]=temp;}
        else break;
     }
     printf("%lld\n",ans);
   }
 return 0;
}

/******************************************************/

#include<stdio.h>
#include<stdlib.h>
main()
{
 int n,m;
 while(scanf("%d",&n)==1&&n!=0)
   {
    int number[100001]={0},m,a,b,c;
    long long int line[5001],top=0;
     for(a=0;a<n;a++)
         {
            scanf("%d",&m);
            number[m]++;
          }
    for(a=1;a<=100000;a++)
         for(b=0;b<number[a];b++)
             line[top++]=a;
    long long int sum=0,temp;
    for(a=1;a<n;a++)
       {
          int data=line[a-1]+line[a];
          sum=sum+data;
            for(b=a+1;b<n;b++)
                 if(line[b]<data)
                   line[b-1]=line[b];
                 else break;
          line[b-1]=data;
     }
     printf("%lld\n",sum);
   }
 return 0;
}