Codeforces Round #676 (Div. 2)

到中期总有不安的焦虑导致想法过多的懈怠,打打cf找找状态,赛中又回到之前浮躁的状态,总是不能很好的静下心。赛后静下来发现自己在模拟比赛中还是专注不够,造成一些过于啥b 的想法。
比赛前静心,集中思考,思路放宽点。

题目:A. XORwice
在这里插入图片描述
求最小的(a ^ x)+(b ^ x)。 明显贪心找a和b的公共1部分全变为0。a,b与完取异或即可,看看数据容易发现也就是直接a,b异或。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        ll a,b;
        scanf("%lld %lld",&a,&b);
        printf("%lld\n",(a^(a&b))+(b^(a&b)));
    }
    return 0;
}

题目:B. Putting Bricks in the Wall

给定一个n*n的图,从(1,1)走到(n,n),其余由0,1组成,你走到的格子是0那么就必须走0,同理1,问你最少改变几次使得从起点走不到终点。

题意读矛盾了,题中说明了给定的是存在的解,并且不需要你找到最小的。。。。(所以我们只需要考虑左上角以及右下角的值即可)。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
char s[205][210];
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;++i) {
            scanf("%s",s[i]+1);
        }
        if(s[1][2]==s[2][1] && s[n][n-1]==s[n-1][n]) {
            if(s[1][2]==s[n][n-1]) {
                printf("2\n2 1\n1 2\n");
            }
            else {
                printf("0\n");
            }
        }
        else if(s[1][2]==s[2][1]) {
            if(s[n][n-1]==s[1][2]) {
                printf("1\n%d %d\n",n,n-1);
            }
            else {
                printf("1\n%d %d\n",n-1,n);
            }
        }
        else if(s[n][n-1]==s[n-1][n]) {
            if(s[n][n-1]==s[1][2]) {
                printf("1\n1 2\n");
            }
            else {
                printf("1\n2 1\n");
            }
        }
        else {
            vector<PP>hh;
            if(s[n][n-1]=='1') {
                hh.push_back(mmp(n,n-1));
            }
            if(s[n-1][n]=='1') {
                hh.push_back(mmp(n-1,n));
            }
            if(s[1][2]=='1') {
                hh.push_back(mmp(2,1));
            }
            if(s[2][1]=='1') {
                hh.push_back(mmp(1,2));
            }
            printf("2\n");
            for(int i=0;i<hh.size();++i) {
                printf("%d %d\n",hh[i].first,hh[i].second);
            }
        }
    }
    return 0;
}

题目:C. Palindromifier

给定一个串S,用图中的两个操作让他变为回文串,输出操作总数,以及擦操作。
在这里插入图片描述
首先判断他是否为回文,回文则为0。
否则我们思考一下abc。
但他们都不一样的时候如何让构造回文,两个操作都是中间数动,可知关键点还是在首尾两个字符。
s 1 s 2 . . . s n − 2 s n s_1s_2...s_{n-2}s_n s1s2...sn2sn可以L操作变为 s n − 2 . . . s 2 s 1 s 2 . . . s n − 2 s n s_{n-2}...s_2s_1s_2...s_{n-2}s_n sn2...s2s1s2...sn2sn
需要找到s1,sn的对称,继续。
s n − 2 . . . s 2 s 1 s 2 . . . s n − 2 s n s n − 2 . . . s 2 s 1 s_{n-2}...s_2s_1s_2...s_{n-2}s_ns_{n-2}...s_2s_1 sn2...s2s1s2...sn2snsn2...s2s1构造了s1的对称,看sn即可。
最后R s2-sn-2。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
char s[100100];
int main() {
    scanf("%s",s+1);
    int len=strlen(s+1);
    bool flag=true;
    for(int i=1;i<=len;++i) {
        if(s[i]==s[len-i+1]) continue;
        else {
            flag=false; break;
        }
    }
    if(flag)
    	printf("0\n");
    else {
        printf("3\n");
        printf("L %d\n",len-1);
        printf("R %d\n",len-1);
        printf("R %d\n",len*2-1);
	}
	return 0;
}

题目:D. Hexagons
在这里插入图片描述
如图蜂巢模型,六个方向各有价值,问从(0,0)到(x,y)的最小距离。
在这里插入图片描述

范围大。考虑构造。
首先分析(0,0)到(1,1)的距离,类似于最短路的松弛边思想达最小,我们放缩六边形的相邻位置,到相邻点最小有10种方法,其中基于最小和相同的排除后,可以发现只有两种比较到达的大小,使得路径最短。可以自己写一写。
完了直接曼哈顿距离计算。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#include<bits/stdc++.h>
//#include<unordered_map>
#define mmp make_pair
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
typedef double ld;
char s[205][210];
int main() {
    int T;
    scanf("%d",&T);
    while(T--) {
        ll x,y;
        scanf("%lld %lld",&x,&y);
        ll c1,c2,c3,c4,c5,c6;
        scanf("%lld %lld %lld %lld %lld %lld",&c1,&c2,&c3,&c4,&c5,&c6);
        c1=min(c1,c2+c6);
        c2=min(c2,c1+c3);
        c3=min(c3,c2+c4);
        c4=min(c4,c3+c5);
        c5=min(c5,c4+c6);
        c6=min(c6,c1+c5);
        ll ans=0;
        if(x>=0 && y>=0) {
            ans+=min(x,y)*c1;
            ans+=(x-min(x,y))*c6+(y-min(x,y))*c2;
        }
        else if(x<=0 && y<=0) {
            x=-x,y=-y;
            ans+=min(x,y)*c4;
            ans+=(x-min(x,y))*c3+(y-min(x,y))*c5;
        }
        else {
            if(x>=0) {
                ans=x*c6+(-y)*c5;
            }
            else {
                ans=(-x)*c3+c2*y;
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值