系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
题目来源
A - Keanu Reeves
题意
输入一个长度为n的二进制字符,把它分为尽可能少的子串,且子串要求为1和0的个数不一样,先判断子串的1和0的个数是否相等,如果相等,直接输出该子串,如果不相等,把第一个字符输出,其余字符再输出
#代码
:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
cin>>s;
int o=0,l=0;
for(int i=0;i<n;i++)
{
if(s[i]=='0')
o++;
else
l++;
}
if(l!=o)
{
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;
}
}
总结:
这题一开始的时候我老是去想样例三的结果是怎么来的,后来才知道只需要输出任意正确的答案即可,样例的结果只是其中之一的答案,这题只需要1和0的数量不一样即可
B - Number Circle
题意
这题是需要将一个序列组成一个圆圈,要求一个数比左右两个数的和小,输出这个序列就可,这题先用sort进行排序,判断最大的数是否小于第二大的数和第三大的数,如果是输出,交换最大的数和第二大数的位置,交换的原因是让最大的数离较大的数更近,以保证比左右之和更小,如果否,输出no;
代码
:

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,i;
int a[100005];
cin>>n;
for( i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
//int maxn=max(maxn,a[i]);
if(a[n-1]<a[n-2]+a[n-3])
{
cout<<"YES"<<endl;
swap(a[n-1],a[n-2]);
for(i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
else
cout<<"NO"<<endl;
}
总结:这题如果想到了这个思路还是比较简单的,一开始我就在想怎么比较,让一个数比较左右两个数的和更小,后来,你发现排序之后,右边的数一定比左一个数大,只需要,比较最大的数是否比第二大和第三大之和小即可。
C - Candies!
题意
本题是把第一第二一组,第三第四一组,以此类推,对10取余,直到最后只剩下一个数字,判断需要几次操作,输出即可,这题用前缀和思想,每组之和其实是总的序列之和,只需要判断该序列除以10,取整输出答案
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n,q,l,r,d;
cin>>n;
int sum[100005];
for(int i=1;i<=n;i++)
{
cin>>d;
sum[i]=sum[i-1]+d;
}
cin>>q;
while(q--)
{
cin>>l;
cin>>r;
cout<<(sum[r]-sum[l-1])/10<<endl;
}
return 0;
}
总结
本题其实一开始,我是想每次之和模除10之后存起来,每次遍历判断,后来发现我得开多少数组啊!寻找规律发现只需要用前缀和就好了
总结
这次训练可以说很成功,希望下次可以做到今日事今日毕,加油吧!我们一定赢!