2010AHOI小学-T1- 等值首尾和 [add]
题目描述
正在上一年级的小卡卡最近开始学习数的加法运算,一天老师为了测试大家对加法的掌握情况,让同学们做了一个有趣的游戏。老师在黑板上从左到右写下了n个大于零的整数,老师接下来找出n个同学完成下面的计算任务。第一个同学在黑板上抄下最左边的数字,第二个同学负责将第一个同学写下的数字,加上老师写下的左边第二个数字所得到的数写在了黑板上。以此类推,第m个同学将前面第m-1个同学所写下的数字加上老师在黑板上写下的从左边数的第m个数字所得之和,并将结果写到黑板上。当计算完成这n个数字之后,老师又让同学从最右边开始按相同的方法再次计算出n个数值。最后老师让同学们找出这所有数字当中共有多少个是相同的。
例如:老师在黑板上写下了7个数,从左到右依次为:3,6,2,1,4,5,2,则同学们第一次从左边开始计算所得到的7个数值应该是:3,9,11,12,16,21,23;而第二次从右边开始计算所得到的7个数值应该是:2,7,11,12,14,20,23;于是第一次与第二次计算出的数值中相同的有3个,它们分别是:11、12与23。
输入格式
第共两行,第一行为n(1<n<100),第二行为n个数,用空格隔开,每个数的大小在0~200之间。
输出格式
第一次与第二次计算出的数值中相同的个数
输入输出样例
输入样例1:
7 3 6 2 1 4 5 2
输出样例1:
3
说明
限制:
50%的数据 1<n<50。
100%的数据 1<n<100。
【耗时限制】1000ms 【内存限制】1028MB
解析
考点:数组+前缀和
本题坑点:每次计算的结果中有可能会有重复的元素,重复的元素只能算一次。
参考代码:
#include<iostream>
using namespace std;
int a[102],b[102],c[102];
int f[20001]; //标记数组 f[i] 数字i有没有被计算过
int main(){
int n,s=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
//从左至右计算前缀和
for(int i=1;i<=n;i++)
b[i]=a[i]+b[i-1];
//从右往左计算后缀和
for(int i=n;i>=1;i--)
c[i]=a[i]+c[i+1];
//比较
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(b[i]==c[j]&&f[b[i]]==0){
s++;
f[b[i]]=1; //标记,防止重复计算
}
cout<<s<<endl;
return 0;
}
2010AHOI小学-T2- 最大连续组长度 [long]
题目描述
今天老师在课堂上让同学们做了一个有趣的游戏。老师叫小卡卡在黑板上任意写下一串由26个英文字母组成的字母序列。然后,老师要求同学们在最短的时间里找出这个字母序列中哪个字母连续出现的次数最多,并且指出该字母一共连续出现了多少次,最先得到正确答案的同学将赢得游戏。
例如:小卡卡写下的字母序列为ABBAAAACC,其中左边起第1个字母A没有连续出现。第二字母B连续出现了2次。第4个字母A连续出现了4次,第8个字母C连续出现了两次。则在这个字母序列中,第4个字母A连续出现的次数最多,共4次。
请大家编程解决这个问题
输入格式
共两行,第一行为字母序列中的字母个数N(1<N<100),第二行为字母序列。
输出格式
共两行,第一行为最多连续出现的次数,第二行为连续出现次数最多的字母。(最多的次数只会出现一次)
输入输出样例
输入样例1:
9 ABBAAAACC
输出样例1:
4 A
说明
限制:
50%的数据 1<N<50。
100%的数据 1<N<100。
【耗时限制】1000ms 【内存限制】128MB
解析
考点:字符串,字符连续性问题
字符连续性典型题目,注意好初始值,连续,中断,更新这些操作即可。
参考代码:
#include<iostream>
using namespace std;
int main(){
string s;
int n,maxn=-1,cnt=1; //cnt=1 初始值 自己也是一个字符
char m;
cin>>n>>s;
for(int i=1;i<n;i++){
if(s[i]==s[i-1]){ //连续就计数
cnt++;
if(cnt>maxn){ //计数同时打擂台
maxn=cnt;
m=s[i-1];
}
}else{ //中断,更新cnt
cnt=1;
}
}
cout<<maxn<<endl<<m;
return 0;
}
2010AHOI小学-T3- 打字游戏 [game]
题目描述
学校组织了一场打字游戏比赛,该游戏开始后会不断从屏幕的上方掉下标有数字的气球,如果在气球坠入屏幕最下方之前按下气球上对应的数字键,则该气球就会被击破(屏幕上方掉下来有数字的气球最多为500个)。当游戏结束后,屏幕中会显示出该选手击破的气球上的所有数字,这些数字按被击破的先后顺序组成的数字串即为游戏者的比赛得分,得分最高者比赛胜出。作为裁判的小卡卡需要按照选手的比赛得分,按从大到小的顺序给每位选手排列名次。得分最高的选手名字排在第一行,而得分最低的选手名字排在最后一行。
请你帮助小卡卡编程完成。
输入格式
共2*N+1行。第一行是一个1到500的整数N,表示总共有N位比赛选手。以下2*N行依次给出每位选手的信息。每位选手的信息都由两行组成。第一行为选手的名字,名字由26个英文字母组成,名字的长度在1~20之间。第二行为一个由一连串的数字所组成的数字串,表示该名选手的得分,该得分的长度在0~500位之间。
输出格式
共N行。依次输出按得分从高到低排好序的各位选手的名字,每个名字占据单独的一行。若几个名字的得分相同,则按名字的字典顺序先后排列。
输入输出样例
输入样例1:
3 Cfdwlj 253562 Dwerflg 9854132 Wlgong 541
输出样例1:
Dwerflg Cfdwlj Wlgong
说明
限制:
50%的数据得分长度在0~10之间,1<N<10。
80%的数据得分长度在0~100之间,1<N<100。
100%的数据得分长度在0~500之间,1<N<500。
【耗时限制】1000ms 【内存限制】128MB
解析
考点:结构体排序,字符串字典序比较
参考代码
#include<bits/stdc++.h>
using namespace std;
struct Player{
string name;
string m;
}s[1001];
bool cmp(Player a,Player b){
//1.比较分数 分数不同
if(a.m!=b.m){
if(a.m.size()!=b.m.size()){ //长度
return a.m.size()>b.m.size();
}
return a.m>b.m; //姓名字典序降序
//2.分数相同,姓名字典序升序
}else{
return a.name<b.name;
}
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i].name>>s[i].m;
}
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n;i++){
cout<<s[i].name<<endl;
}
}