A - Keanu Reeves
题意:
给一个只包含0和1的字符串,将字符串分成多个字串,并且字串相加可以得到原来的字符串,问如何分最小个数的字串使得每个字串中包含的1和0的个数不相等。
题解:
如果0和1的个数是不相等,那么就是本身,相等的,那么就可以把第一个字符当做一个字串,后面的为一个字串,那么两个字串的0和1的个数就是不相等的了。
#include <iostream>
#include <cstdio>
using namespace std;
string str;
int main() {
int n;
int one = 0,zero =0;
cin>>n>>str;
for(int i = 0;i<n;i++) {
if(str[i] == '0'){
zero++;
}
else {
one++;
}
}
if(zero != one) {
cout<<1<<endl<<str;
}
else {
cout<<2<<endl;
cout<<str[0]<<' ';
for(int i = 1;i<n;i++) {
cout<<str[i];
}
}
return 0;
}
B - Number Circle
题意:
就问是否有这样的一个序列,一个数比左右两边的和要小
题解:
直接进行一个排序就行了因为排序好的数列本身就满足条件但是,在最大和最小的位置会出现等于的情况,就可以直接排除,接下来按再将最大的数和次大的数字交换位置即可,此时只需要满足第三大的数字加上第二大的数字大于最大的数字。
#include <bits/stdc++.h>
using namespace std;
#define maxn 100010
typedef long long ll;
int a[maxn],p1[maxn],p2[maxn];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
if(a[n]>=(a[n-1]+a[n-2]))
cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
int cnt1=0,cnt2=0;
for(int i=n;i>=1;i-=2){
p1[++cnt1]=a[i];
if((cnt1+cnt2)>=n) break;
p2[++cnt2]=a[i-1];
}
for(int i=1;i<=cnt2;i++)
cout<<p2[i]<<" ";
for(int i=cnt1;i>=1;i--)
cout<<p1[i]<<" ";
cout<<endl;
}
return 0;
}
C - Candies!
题意:
按题目给的操作来操作一个s序列,问通过给的操作将原序列的长度变为1的过程中最后的答案是多少。
题解:
其实就是问区间求和之后是10的多少倍,区间和除于十就行了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 2e5 + 100;
ll n, sum[maxn];
int main()
{
cin>>n;
for (int i = 1; i <= n; i++)
{
ll temp;
cin>>temp;
sum[i]=sum[i-1]+temp;
}
int q;
cin>>q;
while (q--)
{
int l, r;
cin>>l>>r;
cout<<(sum[r]-sum[l-1])/10<<endl;
}
return 0;
}
D - Add on a Tree
题意:
这题就是问你能不能通过更改一对叶子结点的路径上的权值把树上任意的边权变为任意值,是就yes,不是就no;
题解:
因为要想对任意的边修改权值而不影响的其他边,所以一条边的度数至少应该为2,因此判断度数是否为2就行了。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int vis[maxn]; int main() { int n,u,v; cin >> n; n--; while(n--) { cin >> u >> v; vis[u]++; vis[v]++; } int flag = 1; for(int i = 1;i < maxn; i++) { if(vis[i] == 2) { flag = 0; break; } } if(flag) cout << "YES" << endl; else cout << "NO" << endl; return 0; }