传送门:https://atcoder.jp/contests/abc190
A:
Takahashi和Aoki分别有A和B颗糖果,两人轮流吃一个,若C为0则Takahashi先吃,C为1则Aoki先吃,先吃完的为输。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
B:
Takahashi有N段符咒,每段需要吟唱Xi秒,伤害为Yi,而怪兽能免疫吟唱时间在S秒及以上和伤害在D及以下的符咒,问能否对怪兽造成伤害。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
C:
有N个盘子和M个状态,第i个状态满足当且仅当第Ai和第Bi个盘子上有一个以上的球。有K个人,每个人可以把一个球放在第Ci或者第Di个盘子上。求能满足的最多状态数。
分析:由于K<=16,那么总的情况数只有216种,因此可以直接暴搜,每次更新答案即可。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
D:
给定一个整数N,求有多少个公差为1的等差数列,使得数列和为N。
分析:我们只需考虑数列为正整数的情况,然后乘2即可。因为对于任意一个满足条件的正整数数列a1,a2,……,an,都可以在前面添加一个首项为-a1+1,末项为a1-1的等差数列,使得和仍为N。假设项数为i,那么有(1+i)*i<=2*N。我们枚举每个项数,判断是否合法。
(1)若i为奇数,仅需判断N是否整除i。
(2)若i为偶数:如果N为奇数,那么i不能为4的倍数;如果N为偶数,那么i应为4的倍数。同时对任意N,还要满足N整除i/2,而且N/(i/2)为奇数。
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
E:
有N种宝石和M对组合,表示第Ai和Bi种宝石可以相邻。其他的不能相邻。给出K种需要的宝石,分别为C1,C2,……,Ck,是否存在一个序列满足K种宝石都出现一次及以上,若有输出需要的最小宝石数量。
分析:设dis[i][j]表示i和Cj的最小距离(可以通过对每种需要的宝石进行一次BFS求出),dp[i][state]表示以Ci结尾的状态为state时所需要的最少宝石数(例如state为101,表示序列中有C1和C3)。那么dp[i][state]=min(dp[j][state']+dis[Cj][i]),最终答案为min(dp[i][(1<
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
F:
给出0到N-1的一组排列,将排列向左移位k次,k=0,1,……,N-1,求每次移位后的排列的逆序对数。
分析:我们先算出刚开始的排列的逆序对数x0。每次移位相当于把第一个数放到末尾。对于第i次移位,假设第i-1次移位后的逆序对数为x,第一个数为a0,那么我们只需减去在第i-1次移位中a0的贡献P1,再加上在第i次移位中a0的贡献P2即可。由于这是0到N-1的排列,可以知道P1=a0(所有比他小的数),P2=N-1-a0(所有比他大的数),因此通过循环更新x0即可。
关于求逆序对,可以看一下这道题:https://www.luogu.com.cn/problem/P1908
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include