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\n",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\n",sum); break; } } else{ printf("%.2f\n",sum); cout<<endl; break; } } } } }