题解 P6535 【[COCI2013-2014#1] TRENER】
Utilokasteinn · · 题解
题目的意思是给出一个数n,输入n个字符串,储存下每个字符串开头字母的个数,最后如果有哪个字母开头出现的次数大于等于5次,就输出这个字母。如果一个字母也没有输出,就输出"PREDAJA"。
这道题有两个思路,可以把字符转换成数字来储存,A用a[1]来,b用a[2]来……y用a[25]来,z用a[26]来。还有一个思路是用map数组来储存,不过速度会稍微慢一些,但是比较好想。
思路1代码(实测74ms):
#include<bits/stdc++.h>//万能头
using namespace std;
int n,a[27],flag;//n是n个字符串,a数组用来存放字母出现次数,flag来判断是否有输出
string s;//字符串s
int main()
{
cin>>n;//输入n
for(int i=1;i<=n;i++)
{//输入n个字符串
cin>>s;
a[s[0]-'a'+1]++;
//s[0]即第一个字符串的第一个字母
//如果是a开头减去a的话就是0,所以还要加1
}
for(int i=1;i<=26;i++)//遍历每一个字母
if(a[i]>=5)cout<<char(i-1+'a'),flag=1;
//如果有哪个字母出现次数大于等于5的话,就输出这个字母
//并且flag=1,表示有输出了
if(flag==0)cout<<"PREDAJA";//如果没有输出就输出"PREDAJA"
return 0;//程序结束
}
思路2用map数组,可能有些人不会用map数组,其实map数组很简单
先写一个map,map是关键字
map<数组下标类型,数组存储类型>数组名;
举一个例子:
map<long long,long long>a;
就是一个数组a,下标类型是long long,存储类型是long long
有的时候数组不够大就可以这样写,就是速度会比普通数组慢一些
这道题可以开一个map数组,数组下标是char类型的,存储的数据是int型的
就像这样:
map<char,int>a;
思路2(实测78ms,稍微慢了一些):
#include<bits/stdc++.h>
using namespace std;
int n,flag;
string s;
map<char,int>a;//定义一个map输出,下标类型是char,存储类型是int
int main()
{
cin>>n;//输入字符串个数
for(int i=1;i<=n;i++)
{//输入n个字符串
cin>>s;
a[s[0]]++;
//s[0]即开头字母,
}
for(int i='a';i<='z';i++)//从a到z所有的字母
if(a[char(i)]>=5)cout<<char(i),flag=1;
//这里要记得类型的强制转换
if(flag==0)cout<<"PREDAJA";//如果还没有输出就输出"PREDAJA"
return 0;//程序结束
}
谢谢观赏。