目录
A - Keanu Reeves
题意:
给一个数量为n的0,1字符串,如果0和1的数量是不相等的它就是good,反之就是不好的,需要你去尽量少的切割子串使切割后的子串是good的。
思路:
思维题,是good就输出,不是的话0和1的数量肯定是相等的,那么把第一个字符作为一个子串,后面的字符为一个子串0,1的数量肯定都不相等,所以只有1和2个子串的情况
代码:
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n;
string s;
cin>>n;
cin>>s;
int cnt1=0,cnt2=0;
for(int i=0;i<n;i++)
{
if(s[i]=='0')
cnt1+=1;
if(s[i]=='1')
cnt2+=1;
}
if(cnt1!=cnt2)
{
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;
}
}
B - Number Circle
题意:
给一个元素为n的数组,把它想成数组首尾相连的环,每个元素的左右相邻元素被称为邻居,你需要想办法使每个元素小于左右邻居之和。
思路:
使用sort对数组从小到大排序,只需要判断最后三个数就行,最后一个数为最大值小于倒数第二个加上倒数倒数第三个就行,然后把倒数第一个放到第一位,倒数第二个放到第二位,倒数第三个放到最后一位,这样他们三个的位置就是符合条件的,其余位置将剩下的数字顺序或者倒序输入均可。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n;
int a[100005];
while(cin>>n)
{
for(int i=0; i<n; i++)
cin>>a[i];
sort(a,a+n);
int flag=1;
if(a[n-1]<a[n-3]+a[n-2])
{
cout<<"YES"<<endl;
cout<<a[n-1]<<" "<<a[n-2];
for(int i=0; i<n-2; i++)
cout<<" "<<a[i];
cout<<endl;
}
else
cout<<"NO"<<endl;
}
}
C - Candies!
转载自codeforce 1189C Candies! ----前缀和 - 啾啾猫猫 - 博客园 (cnblogs.com)
题意:
给你一个数组每个数不大于9,然后给你m个区间,每个区间的长度都是2的k次方(k=0 1 2.....) 有一种操作是把奇数位和偶数位相加 用和来代替之前的两个数,如果和大于等于10就要膜10并且答案计数+1 。每一个区间询问你需要输出把这个区间的每队奇数位和偶数位不断相加取膜处理。问你最后只剩一个数的时候,取了几次膜。
思路:
因为最后都是要加和到只剩一位的,所以直接前缀和然后再除10就是答案了
#include<bits/stdc++.h>
using namespace std;
long long i,n,k,x,m;
long long a[100050];
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>x;
a[i]=a[i-1]+x;
}
cin>>m;
for(i=0;i<m;i++)
{
cin>>x>>k;
cout<<(a[k]-a[x-1])/10<<endl;
}
}