gx开题,看上了E就直接干,然后总是输出超限,交了几次交不上就开摆了,于是就把比赛扔给我,不过也没办法,谁叫咱来的最晚呢。
A . T9 Craziness
题意
先录入单词,然后以九键输入法的规则读取所给数字组合所代表的单词,如果有没录入的直接输出无,如果全都录入了且只有一种情况就输出转换后的句子,否则输出可能的句子数。
思路
两个map,一个记录单词对应的数字组合出现的次数,一个将数字组合映射成单词,之后逐行读入,将每个数字组合出现的次数相乘,为0则代表无法输出,为1则代表只有一种输出,用第二个map逐词输出即可,为其他大于一的数字即为可输出的句子种数。
代码
#include<bits/stdc++.h>
using namespace std;
map<string,int> mm;
map<string,string> mmm;
string s,ss,line,word;
vector<string>p;
int main()
{ int n,m,num,t=0,tt=0,sum=1;
cin>>n;
while(n--)
{ ss="";
cin>>s;
for(int i=0;i<s.length();i++)
{ if(s[i]-'a'+1<=3) ss+="2";
if(s[i]-'a'+1>3&&s[i]-'a'+1<=6) ss+="3";
if(s[i]-'a'+1<=9&&s[i]-'a'+1>6) ss+="4";
if(s[i]-'a'+1<=12&&s[i]-'a'+1>9) ss+="5";
if(s[i]-'a'+1<=15&&s[i]-'a'+1>12)ss+="6";
if(s[i]-'a'+1<=19&&s[i]-'a'+1>15) ss+="7";
if(s[i]-'a'+1<=22&&s[i]-'a'+1>19) ss+="8";
if(s[i]-'a'+1<=26&&s[i]-'a'+1>22) ss+="9";
}
if(mm.count(ss)==1) mm[ss]++;
else mm[ss]=1,mmm[ss]=s;
}
cin>>t;
scanf("\n");
while(t--)
{ tt++;sum=1;
int pt=0;
getline(cin,line);
istringstream ss(line);
while(ss>>word)
p.push_back(word);
for(string x:p)
sum*=mm[x];
cout<<"Message #"<<tt<<": ";
if(sum==0) cout<<"not a valid text";
else if(sum==1)
for(string x:p)
cout<<mmm[x]<<" ";
else
cout<<"there are "<<sum<<" possible messages";
cout<<"\n\n";
}
}
B . Pair Isograms
题意
水题,判断字符串中的字母是否成对出现。
思路
首先判断字符串长度,为奇数直接判否,为偶数再用数组记录单词出现的次数,最后遍历26个字母出现的次数,看是否都是0或2。
代码
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{ int n,i,j,b[200];
cin>>n;
while(n--)
{ int pt=1;
memset(b,0,sizeof(b));
cin>>s;
if(s.length()%2==1) pt=0;
else
{ for(int k=0;k<s.length();k++)
b[s[k]-'a'+1]++;
for(int k=1;k<=26;k++)
if(b[k]==0||b[k]==2) continue;
else {pt=0;break;}
}
for(int k=0;k<s.length();k++)
cout<<s[k];
if(pt==1) cout<<" --- pair isograms";
else cout<<" --- not pair isograms";
cout<<"\n\n";
}
}
E . Waterford Wackiness
题意
从东西南北四个方向向十字路口行车,记录每辆车驶来的方向以及它与此方向上的上一辆车的时间间隔,问经过十字路口的车的先后顺序。
思路
分四个方向通过求前n项和得出到达十字路口的时间,排序后输出。
代码
#include<bits/stdc++.h>
using namespace std;
struct ss //结构体
{ char c;
int id;
int time;
}s[110];
bool cmp(ss a, ss b)
{
return a.time<=b.time;
} //结构体排序函数
int main()
{ int t,f1=0,f2=0,f3=0,f4=0,tt=0,n;
cin>>t;
while(t--)
{ f1=0,f2=0,f3=0,f4=0,n;
tt++;
cin>>n;
for(int i=1;i<=n;i++)
{ cin>>s[i].id>>s[i].c>>s[i].time;
if(s[i].c=='N') //求相对零时刻的时间
{ s[i].time+=f1;
f1=s[i].time;
}
else if(s[i].c=='S')
{ s[i].time+=f2;
f2=s[i].time;
}
else if(s[i].c=='W')
{ s[i].time+=f3;
f3=s[i].time;
}
else if(s[i].c=='E')
{ s[i].time+=f4;
f4=s[i].time;
}
}
sort(s+1,s+1+n,cmp);
cout<<"Data set #"<<tt<<":\n";
for(int i=1;i<=n;i++)
cout<<"Car #"<<s[i].id<<"\n";
cout<<"\n";
}
}
I . Symmetric Diagonals
题意
输出矩阵的第n对角线元素,其中第n对角线为与主对角线距离为n+1的斜线元素。
思路
先按行输出右上斜线元素,即行标比列标大n-1的元素;再按行输出左下斜线元素,即行标比列标小n-1的元素;越界则跳过。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long m,n,i,j,k,a[11],b[11],c[11],t,mm;
char s[20][20];
int main()
{
while(cin>>n && n)
{
mm=0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>s[i][j];
printf("Input matrix #%lld:\n",++m);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++)
{
cout<<s[i][j];
if(j!=n-1) cout<<" ";
else cout<<endl;
}
}
cin>>k;
while(k--)
{
cin>>t;
printf("Symmetric diagonals %lld:\n",++mm);
if(t==1)
{
for(int i=0, j=t-1; j<n; i++,j++){
cout<<s[i][j];
if(j!=n-1) cout<<" ";
else cout<<endl;
}
}
else
{
for(int i=0, j=t-1; j<n; i++,j++){
cout<<s[i][j];
if(j!=n-1) cout<<" ";
else cout<<endl;
}
for(int i=0, j=t-1; j<n; i++,j++){
cout<<s[j][i];
if(j!=n-1) cout<<" ";
else cout<<endl;
}
}
}
cout<<endl;
}
return 0;
}