比赛过程
今天比赛自己十分混乱,开场和队友商量看C,遇上小学期第一天下午老师讲课,边听课边思考,一度裂开。后面想到了方法但是还是wa了(枯了)。
题解
I:思维模拟
题意
两个人A和B分别持有两个数组,每一轮都要扔出去一个数,直到最后都只剩下最后一个数字。A想要使得两个数的差最多,B则相反。现在给你数组,要你求出两人的最佳决策后最后的答案。
思路
不管A剩下哪一个数字,B都有办法剩下那个与之相差最小的数。那么答案就是A的所有数与B的所有数字中最小差里面最大的。
1 | int n, a[N], b[N]; |
D:找出规律构造
题意
给出一个长度为2n的循环字符串,问是否能重新排列使得没有相同的长度为n的子串。
思路
分四种情况:
只有一种字符,不可能成功;
有两种字符,其中一种占一半以上,另一半一定<=n.少的一种小于3时,不可能成功;
少的一种至少为3个,成功;
如果种类多于2种,成功;
1 | vector<char> v; |
B:DP
题意
有n个问题和两种状态。每个问题的两种状态下获得的经验和所需时间都不同。初始状态为状态一,且获得足够经验后才可以到状态二,同理获得足够经验才可以通过状态二。求通关的最短时间。
思路
建立三维dp数组dp[i][j][k],代表解决任务i是获得状态一的j点经验,状态二的k点经验。
1 | struct ac{ |