题面 做背包时可以通过排序来使得转移满足某种限制或是让我们判断一个状态是否有贡献 这个题将人数从大到小排序后做背包,这样每次那个最小的党加入而使得答案合法时之前的党也都是合法的 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,M=; int n,sum,ans,half; int a[N],dp[M]; bool cmp(int a,int b) { return…
题面 如果没有两个数不能相同这个限制就两个数组排序后贪心即可.现在加上这个限制,注意到每个数组中的数是两两不同的,所以每次一定能在前面或后面一个数中找一个换过来,这样每次考虑相邻三个数转移就可以了,注意特判一下边界. #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; long long a[N],b[N],dp[N],n,…