题目链接:https://codeforces.com/contest/1221
A - 2048 Game
随便搞搞。
B - Knights
题意:在一个n*n的棋盘中,每个格子放一个黑马或者白马。求一种放置方案使得互相攻击的异色马最多。
题解:奇偶染色。
C - Perfect Team
题意:有c个代码手,有m个口胡怪,有x个倒水哥。要求组成尽可能多的三人队,每个三人队至少有一个代码手和一个口胡怪。
题解:首先先把1:1:1的队伍尽可能配出来,这时如果用完了代码手或者口胡怪,就得到了答案。否则是用完了倒水哥。那么两种极端的情况分别是:全部都是2个代码手配1个口胡怪,全部都是1个代码手配2个口胡怪,这两种直接算出来,剩下的总是有办法配出尽可能多的三人队。
void TestCase() { ll c, m, x; scanf("%lld%lld%lld", &c, &m, &x); ll ans = 0; ll tmp = min(c, m); if(x >= tmp) ans += tmp; else { ans += x; c -= x; m -= x; tmp = min(c, m); if(c >= 2 * m) ans += m; else if(m >= 2 * c) ans += c; else ans += (m + c) / 3; } printf("%lld\n", ans); }
D - Make The Fence Great Again
题意:有一个n个数的数组,把第i个数字ai增加1的代价为bi,可以对任意元素增加任意次。求最小的花费使得整个数组没有临位相同。
题解:看起来只有“临位相同”一个制约条件,那么感觉就是一个dp,而且情况还不多。
猜想:每个元素其实最多被增加1次。
设dp[i][j]表示已经完成前i个元素,且第i个元素增加j次的总花费。
那么:dp[1][0]=0,dp[1][1]=b[1],这个非常简单。后面的会用到吗?
那么:dp[2][0]=?,若a[1]a[2],那么只能从dp[1][1]转移,并且显然没有必要从dp[1][2]转移,若a[1]+1a[2],那么显然只能从dp[1][0]转移,并且显然dp[2][2]也没有意义;dp[2][1]=?,若a[1]a[2],同理从dp[1][0]转移,若a[1]a[2]+1,同理从dp[1][1]转移。所以猜想好像是对的?第一个样例都过不了!
但是这个貌似还是有启示,会不会每个元素最多被增加2次呢?
来源:https://www.cnblogs.com/KisekiPurin2019/p/12640383.html