Codeforces Round #715 (Div. 2)
题号 | 题目 | 知识点 |
---|---|---|
A | Average Height | |
B | TMT Document | |
C | The Sports Festival | 区间dp |
D | Binary Literature | 构造题 |
E | Almost Sorted | |
F | Complete the MST |
A
题意:
如果两个相邻的数的和是偶数,则贡献为1
如何排序使得贡献值最大
题解:
奇+奇=偶
偶+偶=偶
把奇数放一起,把偶数放一起,然后输出
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<stack>
#define debug(x) printf("x = %d\n",x);
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=2e4+9;
int a[maxn];
int b[maxn];
int main()
{int t ;cin>>t;while(t--){int tota=0;int totb=0;int n;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;if(x%2==0)a[++tota]=x;else b[++totb]=x;}for(int i=1;i<=tota;i++){printf("%d ",a[i]);}for(int i=1;i<=totb;i++){printf("%d ",b[i]);}cout<<endl;}
}
B
题意:
给你一个T和M组成的字符串,问这个字符串能否拆分成数个子序列TMT
题解:
先看T的数量是否为M的两倍,然后从左往右,依次读,遇到T,ans++,遇到M,ans–,如果ans中途为负,或者读完字符串ans不为9,则答案为NO
然后倒着也来一遍
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<stack>
#define debug(x) printf("x = %d\n",x);
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--){int n;cin>>n;string s;cin>>s;int ans1=0,ans2=0;bool f=0;for(int i=0;i<n;i++){if(s[i]=='T')ans1++;else ans2++;}if(ans1!=(ans2*2)){cout<<"NO"<<endl;continue;}ans1=0,ans2=0;for(int i=0;i<n;i++){if(s[i]=='T')ans1++;else {if(ans1==0){cout<<"NO"<<endl;f=1;break;}else {ans1--;}}}if(f==1){continue;}ans1=0,ans2=0;for(int i=n-1;i>=0;i--){if(s[i]=='T')ans1++;else {if(ans1==0){cout<<"NO"<<endl;f=1;break;}else {ans1--;}}}if(f==0)cout<<"YES"<<endl;}return 0;
}