A - Keanu Reeves
题意:
给定一个只包含0和1的字符串,判断字符串中0和1的数量是否相同,若不相同输出1然后将字符串输出,若相同则输出2然后将字符串分成两部分输出并且保证两部分字符串中0和1的数量不同。
思路:
首先统计字符串中0和1的数量,判断0和1的数量是否相同,若不相同输出1然后将字符串输出,若相同只需要将第一个字符或最后一个字符单独输出就可以满足条件了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,num1=0,num2=0;
string s;
cin>>n;
cin>>s;
for(int i=0;i<n;i++)
{
if(s[i]=='0')
{
num1++;
}
else if(s[i]=='1')
{
num2++;
}
}
if(num1==num2)
{
cout<<2<<endl;
for(int i=0;i<n-1;i++)
{
cout<<s[i];
}
cout<<" "<<s[n-1]<<endl;
}
else
{
cout<<1<<endl<<s<<endl;
}
return 0;
}
B - Number Circle
题意:
给定一个序列,将序列的首尾相连要求重新排列后每一个元素都要满足a[i]<a[i-1]+a[i+1]。
思路:
将序列从小到大排序后(例如1,2,3,4,5,6),可以发现所有元素都满足a[i]<a[i-1]+a[i+1],那么我们要靠考虑的就是将序列首尾相接后如何排列了,将序列首尾相接后(1,2,3,4,5,6,1)我们只需要将首尾排列成a[i]<a[i-1]+a[i+1]就可以满足条件了,要想做到这一步就要让排序后最大的数(比如样例序列的6)之后的那个与首部相连的那个尾部尽可能的大(1,2,3,4,6,5,1),所以只需要在序列排序后将最大的数和第二大的数交换位置就可以了。
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
if(a[n-3]+a[n-2]>a[n-1])
{
cout<<"YES"<<endl;
swap(a[n-1],a[n-2]);
for(int i=0;i<n-1;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n-1]<<endl;
}
else
{
cout<<"NO"<<endl;
}
return 0;
}
C - Candies!
题意:
给定一个所有数字都小于10的序列,每次询问的操作就是将相邻的数相加取代之前的的两个数,如果相加后的数字大于等于10就要对10取模,询问区间大小为2的非负整数次幂,求每次询问取模操作做了多少次。
思路:
题目要求两数相加后如果大于10就对10取模,问最后做了多少次取模操作,其实直接将区间内的数求和后再判断要对10做多少次取模操作即可,也就是区间求和后除10即为操作次数,所以我们用数组记录前缀和直接求得区间和然后除10就可以求出区间内对10取模的操作次数了。
#include<bits/stdc++.h>
using namespace std;
int s[100005];
int main()
{
int n,q,l,r,num=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]+=s[i-1];
}
cin>>q;
while(q--)
{
cin>>l>>r;
cout<<(s[r]-s[l-1])/10<<endl;
}
return 0;
}