Codeforces Round #572 (Div. 2)
A - Keanu Reeves
题意:
给定一个n长的只含1和0的字符串,将其分割成一个或若干个1和0个数不相等的字符串。
输出字符串的个数以及分割后的字符串。
分析:
思维题。当字符串本身含0和1的个数不相同,输出1和其本身。当其个数相等,依次输出2、字符串的第一个字符,和剩下的字符。
代码:
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
int n;
char s[105];
int main(){
cin>>n;
int one=0;
int zero=0;
for(int i=0;i<n;i++){
cin>>s[i];
if(s[i]=='1') one++;
if(s[i]=='0') zero++;
}
if(one!=zero){
cout<<"1"<<endl;
cout<<s<<endl;
}
else{
cout<<"2"<<endl;
cout<<s[0]<<" ";
for(int i=1;i<n;i++){
cout<<s[i];
}
cout<<endl;
}
return 0;
}
PS:又在奇奇怪怪的地方WA了 string的输出问题。cout不能输出一个string,如果要正常使用cout输出string,则要添加 #include<string>(忘记了T_T)
B - Number Circle
题意:
给定一个n长的序列,它们形成一个圈,每个数都有两个邻居(相邻数,左右两边).
问这些数是否能构成一个序列,使每一个数的值都小于它的两个邻居之和。
能,输出YES和这个序列(可以从任意元素开始);否则输出NO.
分析:
思维题。要使每一个数的值都小于它的两个邻居之和,可以先将该序列排序。如下:
2 5 1 4 3 ==>1 2 3 4 5
排完序后,可看出除了倒数第一个之外,其他数一定均满足条件(每个数肯定<=右相邻数,再加上左相邻数就肯定满足了),然后只有最后一个数不一定会满足,所以需要特别处理一下最后一个数。
为了使最后一个序列中最大的数满足,就让的邻居变成第二大的数和第三大的数,如下:
1 2 3 4 5 ==>1 2 3 5 4
在这个条件下,若不能满足,则不存在这个序列。
代码:
#include<algorithm>
#include<cstdio>
#include<iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
typedef long long ll;
int a[100005];
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
swap(a[n-2],a[n-1]);
if(a[n-1]+a[n-3]>a[n-2]){
cout<<"YES"<<endl;
for(int i=0;i<n-1;i++){
cout<<a[i]<<" ";
}
cout<<a[n-1]<<endl;
}
else cout<<"NO"<<endl;
return 0;
}