摘要:
本文是The 2018 ACM-ICPC Asia Qingdao Regional Contest(青岛现场赛)的部分解题报告,给出了出题率较高的几道题的题解,希望熟悉区域赛的题型,进而对其他区域赛的准备有借鉴意义。
题意
给出x和k,计算gk(x)。
解题思路
通过观察发现,g函数经过一定次数的递推一定会在0和1之间变换,所以循环内加判断提前结束递推即可。
易错分析
注意计算f(0)返回的是1的问题,下面的写法避免了这种错误。
代码实现
1 #include <cstdio> 2 using namespace std; 3 4 typedef long long ll; 5 ll a[] = { 1,0,0,0,1,0,1,0,2,1}; 6 7 ll f(ll x) { 8 ll s = 0; 9 while(x) { 10 s += a[x%10]; 11 x /= 10; 12 } 13 return s; 14 } 15 ll g(ll x, ll k) { 16 ll g0 = x, g1; 17 for(ll i = 1; i <= k; i++) { 18 if(g0 == 0) { 19 if((k - i) & 1) 20 return 0; 21 else 22 return 1; 23 } 24 g1 = f(g0); 25 g0 = g1; 26 //printf("#%lld\n", g0); 27 } 28 return g0; 29 } 30 int main() 31 { 32 int T; 33 scanf("%d", &T); 34 ll x, k; 35 while(T--) { 36 scanf("%lld%lld", &x, &k); 37 printf("%lld\n", g(x, k)); 38 } 39 return 0; 40 }
题意
输入书的总本数和已经购买的书的本数以及每本书的价格
问按照他的购买策略这个人最多带了多少钱,购买策略就是从前往后只要手中的钱够买当前这本书就买,不够买就跳过。
解题思路
除去样例中给出的三个特例,分别是n == m,m == 0,k > m(其中k表示0的个数),剩下的就是一般情况,直接贪心不是正确的结果,因为有0的存在,所以需要仔细考虑,我们肯定要将价格为0的书先买走,然后从前往后买,买够m本书之后(sum),在剩下的书中选择一本最便宜的书买不起(也就是minx-1),最后总的钱数sum + minx - 1就是答案。
助解样例
5 2
0 0 2 3 0
7 4
0 0 2 3 4 2 0 0
4 2
0 0 1 1
代码
#include <cstdio> #include <algorithm> using nam