coins HDU - 3348

原题链接

考察:贪心

思路:

        最小数量很好求,从大到小贪心即可.关键是最大数量.我们要考虑全部取最小的剩下的还能否被表示的问题.直接取很难求,至少本蒟蒻没想出来怎么求.

        我们求出C的最小数量后,可以发现剩下的是表示总钱数sum-C的最大数量.根据此我们可以求出sum-C的最小数量,剩下的就是最大数量

注意: 不要用C%5当作用去的1元币,如果其他钱数不够只能用一元币答案就会错误.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int N = 6;
 7 typedef pair<int,int> PII;
 8 PII p[N];
 9 int money[6] = {0,1,5,10,50,100};
10 int solve(int C)
11 {
12     int sum = C,ans =0;
13     for(int i=5;i>=1;i--)
14     {
15         int t = sum/p[i].first,k = p[i].second;
16         sum-=min(t,k)*p[i].first;
17         ans+=min(t,k);
18     }
19     if(sum>0) return -1;
20     else return ans;
21 }
22 int main() 
23 {
24     int T;
25     scanf("%d",&T);
26     while(T--)
27     {
28         int C,sum = 0,sum2 = 0;
29         scanf("%d",&C);
30         for(int i=1;i<=5;i++)
31         {
32             scanf("%d",&p[i].second);
33             p[i].first = money[i];
34             sum+=p[i].first*p[i].second;
35             sum2+=p[i].second;
36         }
37         int ans = solve(C);
38         if(ans!=-1)
39         {
40             for(int )
41         }else printf("-1 -1\n"); 
42     }
43     return 0;
44 }

 

posted @ 2021-02-21 02:17  acmloser  阅读(29)  评论(0编辑  收藏  举报