HDU 2187汶川地震

一直WA的代码想不通为什么:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
int a[1005];
int b[1005];

int main(){
   int k,i,T,m;
   float money,tmp,d,sum;

    cin>>T;
    while(T-- ){
            sum = 0;
            cin>>money;
            cin>>k;
            for(i=0;i<k;i++){
                cin>>a[i]>>b[i];

            }
            while(1){
                 tmp = 100;
                 for(i=0;i<k;i++){
                        if(tmp>a[i]){
                    tmp = a[i];
                    m=i;
                    a[i]+=1005;}

                }
                d=money/tmp;
                if(b[m]>=d)
                {
                sum+=d;
                printf("%.2f
",sum);
                    break;
                }
                else
                    sum+=b[m];
                money-=tmp*b[m];

           }
    }
}

后来换了一种思路终于AC的:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int a[1005];
int main(){
    int i,j,T,k,m,n,d;
    float money,sum,tmp;
    cin>>T;


    while(T--){
    cin>>money;
    cin>>k;
        sum=0;
    for(d=0;d<1005;d++)//不能用memset()函数初始化0,第二次执行这个,不会初始化上次被赋值过的数组
		a[d]=0;
    for(i=0;i<k;i++){
        cin>>n>>m;
            a[n]+=m;//用下面的循环把单价按照从小到大排列了,又把数量存在了单价里
    }


            for(j=0;j<1005;j++){
            if(a[j]!=0){
                if(money>0){
                        tmp=money/j;
                if(tmp>a[j]){
                    sum+=a[j];
                    money-=j*a[j];}
                else{
                   sum+=tmp;
                    printf("%.2f
",sum);
                    break;
                }

                }
    else{
        printf("%.2f
",sum);
        cout<<endl;
        break;
        }
            }
            }
    }
    }




原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256476.html