题号 | 题目 | 知识点 | 质量 |
---|---|---|---|
1504A | Déjà Vu | 思维题 | |
1504B | Flip the Bits | 贪心 | |
1504C | Balance the Bits | 构造题 | |
1504D | 3-Coloring | 思维题,构造题 | |
1504E | Travelling Salesman Problem | 思维题 | 好题啊 |
1504F | Flip the Cards | 贪心,思维题 | 现在还没搞明白,不错的思维题 |
A~D题解代码如下
E
文章目录
- A
- 题意:
- 题解:
- 代码:
- B
- 题意:
- 题解:
- 代码:
- C
- 题目:
- 题解:
- 代码:
- D
- 题目:
- 题解:
- 代码:
A
题意:
给你一个字符串,在某一个位置添加一个a,问能不能不构成回文串,并输出任意答案
题解:
从开头开始找,只要不是a,对应的另一端的位置直接插入a即可
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int main()
{int t;cin>>t;while(t--){string a;cin>>a;bool f=0;for(int i=0;i<a.length();i++){if(a[i]!='a'){f=1;break;}}if(f==0){cout<<"NO"<<endl;}else {cout<<"YES"<<endl;for(int i=0;i<a.length();i++){if(a[i]!='a'){a.insert(a.length()-i, "a");//cout<<"a="<<a<<endl;break;}}cout<<a<<endl;}}
}
B
题意:
从第一位开始,任意长度选一个区间,区间内0,1翻转,问a串能不能变成b串
题解:
过了太久记不清了。。。
奥对,不同的相邻区间内0和1一样多,且之前的相同的相邻区间内0和1数量一样多,
我们将区间分为a和b一样的区间和a和b不一样的区间,每到一个新区间,前一个区间内的01必须一样多,这样翻转才不会乱
应该是这样
比如:
0111010000
0100101100
区间1 ~ 2一样,区间3 ~ 8不一样
这两个区间内,各自的01数量必须一样多
区间9 ~ 10因为在区间3 ~ 8之后,所以不用考虑
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=3e5+8;
int x[maxn];
int sum[maxn];
int main()
{int t;cin>>t;while(t--){int n;cin>>n;string a,b;cin>>a>>b;if(a==b){cout<<"YES"<<endl;continue;}//for(int i=0;i<n;i++)sum[i]+=(a[i]=='1');int last=-1;bool f=0;int x1=0,x0=0;int y1=0,y0=0;bool xx=0;for(int i=0;i<=n;i++){if(a[i]==b[i]){if(a[i]=='1')y1++;else y0++;if(x0!=x1){f=1;break;}x0=0;x1=0;}else if(a[i]!=b[i]){if(a[i]=='1')x1++;else x0++;if(y1!=y0){f=1;break;}y1=0;y0=0;}}if(f==1||(x1!=x0))cout<<"NO"<<endl;else cout<<"YES"<<endl;}return 0;
}
C
题目:
给你一个01串,构造两个由括号组成的字符串,1表示该位置的两个字符串一样,0表示不一样
题解:
首先两端必然是1,不然有朝内朝外
我记得前一半1第一个字符串是"(",后一半1第一个字符串是“)”
对于0,根据奇偶性输出左右括号
第二个字符串对于1和第一个一样,对于0直接反过来就行
具体构造思路。。太久忘了。。
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=2e5+9;
int b[maxn];
int main()
{int t;cin>>t;while(t--){int n;cin>>n;string a;cin>>a;//int len=a.length();if(a[0]=='0'||a[n-1]=='0'){cout<<"NO"<<endl;continue;}int len=0;for(int i=0;i<n;i++){if(a[i]=='0')len++;}if(len%2==1){cout<<"NO"<<endl;continue;}int len2=n-len;len2/=2;cout<<"YES"<<endl;int ww=0;for(int i=0;i<n;i++){if(a[i]=='1'){ww++;if(ww<=len2){b[i]=0;}else b[i]=1;}}int x=0;for(int i=0;i<n;i++){if(a[i]=='1'&&b[i]==0)cout<<"(";else if(a[i]=='1'&&b[i]==1)cout<<")";else if(a[i]=='0'){x++;if(x%2==1)//奇数个{cout<<")";} else {cout<<"(";}}}cout<<endl;x=0;for(int i=0;i<n;i++){if(a[i]=='1'&&b[i]==0)cout<<"(";else if(a[i]=='1'&&b[i]==1)cout<<")";else if(a[i]=='0'){x++;if(x%2==1)//奇数个{cout<<"(";} else {cout<<")";}}}cout<<endl;}return 0;
}
D
交互题
题目:
每次从1 ~ 3给你一个数,如果给了x就不能选x,再另外两个数里选个数填进n * n的格子里,要求相邻的格子不能有一样的数,问怎么构造
题解:
想象一下网格的颜色就像一个黑白方格的棋盘。然后鲍勃的策略是,只要他有能力,就把1号记号放在白色方块上,把2号记号放在黑色方块上。如果他不能,这意味着一种颜色的所有方块都被填满,他可以开始放置标记3,而不会产生无效的颜色。更具体地说,这是他的策略:
如果Alice选择1:
如果一个黑色正方形是空的,在那里放一个2。
否则,将3放在白色单元格上。
如果Alice选择2:
如果一个白色正方形是空的,在那里放一个1。
否则,将3放在黑色单元格上。
如果Alice选择3:
如果一个白色正方形是空的,在那里放一个1。
否则,将2放在黑色单元格上。
总结:
1放白,2放黑,3穿插在其中
代码:
#include <bits/stdc++.h>
#define BLACK 0
#define WHITE 1
using namespace std;int main() {ios::sync_with_stdio(false);
// cin.tie(0);int n;cin >> n;vector<pair<int, int>> ve[2];// color the cells like a checkerboard// ve[COLOR] = {list of unfilled cells of that color}for(int i = 1; i <= n; i++) {for(int j = 1; j <= n; j++) {ve[(i + j) % 2].push_back({i, j});//(i + j) % 2==1就是白 }}for(int t = 1; t <= n * n; t++) {int a, b, i, j, col;cin >> a;// choose an available checkerboard color and a token color for itif(a == 1) {if(!ve[BLACK].empty()) {col = BLACK;b = 2;}else {col = WHITE;b = 3;}}else if(a == 2) {if(!ve[WHITE].empty()) {col = WHITE;b = 1;}else {col = BLACK;b = 3;}}else { // a == 3if(!ve[WHITE].empty()) {col = WHITE;b = 1;}else {col = BLACK;b = 2;}}tie(i, j) = ve[col].back();ve[col].pop_back();cout << b << ' ' << i << ' ' << j << endl;}
}