题目大意:你的王国里有一条有n个头的恶龙,你希望雇一些骑士来把它杀死(即砍掉所有的头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙所有的头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。输出最少的花费,如果无解,输出“Loowater is doomed!".
解题报告:模拟题,先把所有的恶龙的头的直径和所有的骑士的能力值排一下序,然后一一从前往后比较,当当前的这个骑士可以砍掉当前的这个头的时候,就雇佣这个骑士。可以先定义两个指针,分别指向当前的恶龙的头和当前的骑士,若雇佣成功,则将两个指针都往后移动一位,若雇佣不成功,则将骑士的指针往后移动一位。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 int main() { 5 int n,m,sum,x[20005],r[20005]; 6 while(scanf("%d%d",&n,&m)&&(n||m)) { 7 for(int i=1;i<=n;++i) 8 scanf("%d",&r[i]); 9 for(int i=1;i<=m;++i) 10 scanf("%d",&x[i]); 11 std::sort(r+1,r+n+1); 12 std::sort(x+1,x+m+1); 13 int y=1,z=1; 14 sum=0; 15 while(1) { 16 if(r[y]<=x[z]) { 17 sum+=x[z]; 18 y++; 19 z++; 20 } 21 if(r[y]>x[z]) 22 z++; 23 if(z>m||y>n) 24 break; 25 } 26 if(sum==0||y!=n+1) 27 printf("Loowater is doomed!\n"); 28 else 29 printf("%d\n",sum); 30 } 31 return 0; 32 }