暑假组队训练二

A . T9 Craziness

题意

思路

代码

B . Pair Isograms

题意

思路

代码

E . Waterford Wackiness

         题意

思路

代码

I . Symmetric Diagonals

题意

思路

代码

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦木不emo

打赏一个吧亲

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值