暑期嗨九~

CodeForces - 1216D

这个题自己读了n遍,而且他的提议转化也很好!
题意:n种剑,每种x个,y个人进来拿,每个人那z个,这z个都是一样的,问你,然后给出每种剑剩余的个数,求最少有多少个人,拿了多少把剑。
思路:可以思考一下,剩余个数跟人的多少有啥关系?如果剩余个数越多,每个都越接近x,那么不就是 人少了吗?所以 你就是求他们被拿走的最小公约数,但是它不给你x,那么你就让x=max(a[i]);不就行了吗?这样拿的人就更少了。所以就是算 被拿走数量的最小公约数!

CodeForces - 1216C

错了4遍 才看到自己错在哪里了!!!
题意:就是一块白,两块黑,问你白的不被覆盖的点有还是没有
思路:我是通过面积来做的,算4部分面积
第一部分是 W白色面积w
第二部分是白色和第一块黑色 相交的面积s1
第三部分是白色和第二块黑色相交的面积s2
第四部分是防止你前面算重,就是万一两黑相交的地方在白色里面的话,这样就算了两遍了s3;
若果s1+s2>s3+w 白色全被覆盖 else 有点没被覆盖
说一下自己错在哪里吧,主要是两个地方吧
第一点 比方说我算两黑相交的面积的时候 应该怎么算呢
应该按照下面这样算,但是当时我没去判断哪个c的x2x1 y1y2的大小!!

node c;
	c.x1 = max(a.x1, b.x1);
	c.x2 = min(a.x2, b.x2);
	c.y1 = max(a.y1, b.y1);
	c.y2 = min(a.y2, b.y2);
	if (c.x2 < c.x1 || c.y2 < c.y1) return 0;
	else return (c.x2 - c.x1) * (c.y2 - c.y1);

第二点是在算s3的时候,你不能光把两个黑块相交的面积当成s3,这个s3是白色块和(两黑块相交的的块)的相交的面积!!!!!!!!

CodeForces - 1221A

题意:就算一个集合全是2的幂。然后两个相等的数可以变成一个数(他们的和),问你能不能出来2048;
思路:这个A题啊,确实厉害,挺锻炼思维的。你去算一下把小于2048的2的幂相加,最终结果应该是2047,这说明什么,如果没有一个相等的就不可能凑出来2048,等价于说 只要小于2048的幂相加达到了2048,说明有相等的数字了,所以可以凑出来2048!

CodeForces - 1221B

题意:骑士能攻击到8个方向不同颜色的骑士。有W,B两种颜色的骑士,怎样安排骑士的位置使得互相攻击的骑士数目最多。
思路:找规律,奇数行奇数列放 B,偶数行偶数列放B,其余放W就是答案

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <algorithm>
#include <iomanip>
#include <map>
#include <queue>
#include <vector>
#include <set>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int main()
{
    int n;
    cin>>n;
    for (int i = 1; i <= n; i++) 
    {
        for (int j = 1; j <= n; j++) 
        {
            if (i % 2)
            {
                if (j % 2) printf("W");
                else printf("B");
            }
            else 
            {
                if (j % 2) printf("B");
                else printf("W");
            }
        }
        cout<< endl;
    }
   
}

CodeForces - 1221D

题意:为了不让相邻木板有相同高度,问你要花多少钱呀
思路:可以发现其实你最多一块木板提高0,1,2;最多就两次可以保证相邻不相等!然后用dp二维数组,二维dp[i][j] j表示修改状态。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <algorithm>
#include <iomanip>
#include <map>
#include <queue>
#include <vector>
#include <set>
typedef long long ll;
const ll INF = 2e18;
const int maxn = 3e5 + 7;
ll h[maxn], b[maxn];
ll dp[maxn][3];
using namespace std;
int main()
{
    int q; scanf("%d", &q);//如果用cin的话会超时的!!!!!
    while (q--)
    {
        int n; scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%lld%lld", &h[i], &b[i]);
            dp[i][0] = dp[i][1] = dp[i][2] = INF;
        }

        dp[1][0] = 0;
        dp[1][1] = b[1];
        dp[1][2] = b[1] * 2;

        for (int i = 2; i <= n; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                for (ll k = 0; k < 3; k++)
                {
                    if (h[i - 1] + j != h[i] + k)//如果不相等那就可以
                    {
                        dp[i][k] = min(dp[i][k],dp[i - 1][j] + k * b[i]);
                    }
                }
            }
        }
        cout<<min(dp[n][0], min(dp[n][1], dp[n][2]))<<endl;
    }
  
}

反思:出错太多了,理解题意太慢了,这要是打cf那不得完犊子了。还是反应不够灵敏,这次训练大部分都是abcd的都是需要一些数学技巧和思维灵敏的,继续努力吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值