UVa11292 Dragon of Loowater
解题思路:这是一道简单的贪心题,能力强的骑士开价高,如果能力强,去砍一个很弱
的头,就是浪费人才。所以把雇来的骑士按照能力从小到大排序,所有头直径
按照从小到大排序,一个一个砍就可以了。不能砍掉当前头的就不用雇佣了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 20005; 6 int A[maxn], B[maxn]; 7 int main() 8 { 9 int n, m, sum, cnt1, cnt2; 10 while(~scanf("%d %d", &n, &m) && (n || m)) 11 { 12 for(int i = 0; i < n; i++) scanf("%d", &A[i]); 13 for(int i = 0; i < m; i++) scanf("%d", &B[i]); 14 if(m < n) //因为一个骑士只能砍一个头,如果骑士人数少于 15 //头的个数,则直接输出即可。 16 { 17 printf("Loowater is doomed!\n"); 18 continue; 19 } 20 sort(A, A + n); //直接sort排序,默认从小到大 21 sort(B, B + m); 22 cnt1 = cnt2 = sum = 0; 23 while(1) 24 { 25 if(B[cnt2] >= A[cnt1])//如果能砍掉当前的头,指针同时 26 //往后移一位。 27 { 28 sum += B[cnt2]; 29 cnt2 ++, cnt1 ++; 30 } 31 else cnt2 ++; //如果不能,对应骑士到大指针往后移一位 32 33 if(cnt1 == n || cnt2 == m) break; //如果任何一个指针扫描完了,就跳出。 34 } 35 if(cnt1 == n) printf("%d\n", sum); //如果全部的头都砍了,就输出最少花费 36 else printf("Loowater is doomed!\n"); 37 } 38 return 0; 39 }