Codeforces Round #744 (Div. 3)ABCDE1E2FG题解
Posted quinn18
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #744 (Div. 3)ABCDE1E2FG题解相关的知识,希望对你有一定的参考价值。
文章目录
A - Casimir’s String Solitaire
题目链接
题意:给你一个串,每次可以删一个
A
A
A 和一个
B
B
B 或者删一个
B
B
B 和
C
C
C 问你最后能不能删光所有的字符
所以一个 A A A对应一个 B B B,一个 C C C对应一个 B B B,所以 a + c = = b a+c==b a+c==b
#include <iostream>
#include<string>
using namespace std;
signed main() {
int t;
cin>>t;
while(t--) {
string s;
cin>>s;
int a=0, b=0,c=0;
for(int i=0; i<s.size(); i++){
if(s[i]=='A') a++;
if(s[i]=='B') b++;
if(s[i]=='C') c++;
}
if(b==a+c) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B - Shifting Sort
题目链接
题意:你每次能选择一个区间把里边的数字整体向左边转
k
k
k 个,最终要使数列有序。操作次数不能超过
n
n
n 次
这个不能超过
n
n
n 次
就能想到每次把这个位置应该在的数字给转到这一位
摸你一下就好了
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int b[1005];
int c[1005];
struct node {
int l, r;
int d;
}ans[55];
signed main() {
int t; cin>>t;
while(t--) {
int n;cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
b[i]=a[i];
}
sort(b+1, b+1+n);
int cnt=1; int q=0; int ks=1;
while(1) {
for(int i=ks; i<=n; i++) {
if(a[i]==b[cnt]) {
if(i==ks) {//假如本来就在这位就直接找下一个位置了因为不能l!=r
cnt++;
ks++;
break;
}
cnt++;
ans[++q].l=ks;//存答案
ans[q].r=i;
ans[q].d=i-ks;
int w=a[i];
for(int k=i; k>=ks+1; k--) a[k]=a[k-1];//把区间转过来
a[ks]=w;
ks++;
}
}
bool f=1;
for(int j=2; j<=n; j++) if(a[j]<a[j-1]) {f=0;break;}
if(f||ks==n) break;
}
cout<<q<<endl;
for(int i=1; i<=q; i++) {
cout<<ans[i].l<<" "<<ans[i].r<<" "<<ans[i].d<<endl;
}
}
return 0;
}
C - Ticks
题意:给你一张画好的长方形纸,有长成 V V V 的样子的虫子在上面,可以重叠,问你是不是所有的虫子长度都大于等于 k k k
那我们就去找 V V V 最下面的那个点,然后把合法的虫子位置标记一下,最后看看有没有多的虫子
#include<bits/stdc++.h>
#define pii pair<int, int>
#define int long long
using namespace std;
char a[20][20];
bool vis[25][25];
int n, m, k;
bool in (int x, int y) {//判断在不在图内
return x>=1&&x<=n&&y<=m&&y>=1;
}
signed main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int t; cin>>t;
while(t--) {
memset(vis, 0, sizeof vis);//清空
cin>>n>>m>>k;
for(int i=1; i<=n; i++) {
cin>>a[i]+1;
}
for(int i=n; i>=1; i--) {
for(int j=m; j>=1; j--) {
if(a[i][j]=='*') {
int o=0;
int x=i;
int y=j;
int xx=i;
int yy=j;
//cout<<endl;
while(in(x, y)&&in(xx, yy)&&a[x][y]=='*'&&a[xx][yy]=='*') {
x--;xx--;
y--;
yy++;
o++;
}
o--;
if(o>=k) {
x=i, y=j, xx=i, yy=j;
// cout<<i<<" "<<j<<endl;
while(in(x, y)&&in(xx, yy)&&a[x][y]=='*'&&a[xx][yy]=='*') {
vis[x][y]=vis[xx][yy]=1;
x--;xx--;
y--;
yy++;
}
}
}
}
}
bool q=1;
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(!vis[i][j]&&a[i][j]=='*') q=0;
if(q) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
D - Productive Meeting
题目链接
题意:一堆人交流,两个人每交流一次他们交流的次数就会少一次(狗头,问最多的交流次数
贪心
让交流次数多的人先交流,直到只剩一个人或者都不能交流了
优先队列里直接排序了
#include<bits/stdc++.h>
#define pii pair<int, int>
#define int long long
using namespace std;
struct node {
int a, b;
}b[200005];
signed main() {
int t;
cin>>t;
while (t--) {
int n;
cin >> n;
priority_queue<pii> q;
for(int i=1; i<=n; i++) {
int x;
cin>>x;
if(x) q.push({x, i});
}
int cnt=0;
while (!q.empty()) {
if (q.size() == 1) break;
pii x=q.top();
q.pop();
pii y=q.top();
q.pop();
++cnt;
b[cnt].a=x.second;
b[cnt].b = y.second;
x.first--;
y.first--;
if (x.first!=0) q.push(x);
if (y.first!=0) q.push(y);
}
cout<<cnt<<endl;
for(int i=1; i<=cnt; i++) cout<<b[i].a<<" "<<b[i].b<<endl;
}
return 0;
}
E1 - Permutation Minimization by Deque
题目链接
题意:你有一个双端队列,你可以把当前的数字放在队首也可以放在队尾,最后使队列里的序列字典序最小
所以遇到比头小的就放在头,不然就放在尾
用数组摸你队列
#include<bits/stdc++.h>
using namespace std;
int a[200005];
int b[1000005];
signed main() {
int t; cin>>t;
while(t--) {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
int ks=200005;
int js=200005;
b[ks]=a[1];
for(int i=2; i<=n; i++) {
if(a[i]<b[ks]) b[--ks]=a[i];
else b[++js]=a[i];
}
for(int i=ks; i<=js; i++) {
cout<<b[i]<<" ";
}
cout<<endl;
}
return 0;
}
E2. Array Optimization by Deque
题目链接
题意: 有个双端队列,你要通过翻转相邻的数字使放入以后的序列变得有序,问最小翻转次数的序列
贪心+树状数组
总结
呜呜呜呜呜呜
以上是关于Codeforces Round #744 (Div. 3)ABCDE1E2FG题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #744 (Div. 3) A-F 题解
Codeforces Round #744 (Div. 3) A-F 题解
Codeforces Round #744 (Div. 3)ABCDE1E2FG题解
Codeforces Round #744 (Div. 3)ABCDE1E2FG题解