- 题解
《10.5训练赛》题解
- 2022-10-5 20:39:11 @
10.5题解(按难度递增)
I.谁获得了最高奖学金
上午讲的结构体原题,就简单的结构体应用 (没写出来的自己反思一下吧)
代码:略
H.字母统计
用一个数组来存一下字符串每一个字符出现的次数。
eg:asdfgas
用a[a]来存a的数量
最后在暴力吧数组遍历一遍,输出最多的一个
代码:略
G.小飞棍来喽!
就是字符串判断,本题唯一值得注意的就是要提前判断一下字符串的长度,不然会超时,同时xiaofeigunlailou必须匹配,不能出现多的字符。
eg:xiaofeigunlailoua 这是不符合的
代码:略
D 咩咩数数字
本题纯暴力,最直接的从100-999跑一遍,然后他的2倍3倍的数,把每一位都分解下来,看是不是123456789这几个数字只出现一次,即可。(甚至可以自己手写)
代码:略
F.换ID是吧
利用桶排记录出现了多少种字符串,然后再用总数直接减去字符串的种类就行了。()
#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<set>
using namespace std;
map<string,int>ma;
set<string>s;
char str[11];
struct node{
char str[11];
int sum=0;
}p[1000];
int main()
{
int n;
scanf("%d",&n);
int cnt=0;
while(n--)
{
int flag1=0;
memset(str,0,sizeof(str));
scanf("%s",str);
for(int i=1;i<=cnt;i++)
{
int flag=0;
for(int j=0;j<11;j++)
{
if(str[j]!=p[i].str[j])
{
flag=1;
break;
}
}
if(flag==0)
{
p[i].sum++;
flag1=1;
}
}
if(flag1==0)
{
cnt++;
int s=strlen(str);
for(int i=0;i<s;i++)
{
p[cnt].str[i]=str[i];
p[cnt].sum=1;
}
}
}
int ans=0;
for(int i=1;i<=cnt;i++)
{
if(p[i].sum>1)
{
ans+=p[i].sum-1;
}
}
printf("%d",ans);
}
E.数的性质
先写个埃氏筛,把所有质数筛出来,再根据题意判断。
C 圈圈自己跟自己玩石头剪刀布
按照题意直接把得分表打出来,n作为时间倒计时,然后不断取模循环,访问得分表算累计得分就行。
代码(卫叔提供)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 + 10;
int n, na, nb, a[MAXN], b[MAXN], cnta, cntb;
int vs[5][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; //得分表的处理
int main()
{
cin >> n >> na >> nb;
for(int i = 0; i < na; i++) cin >> a[i];
for(int i = 0; i < nb; i++) cin >> b[i];
for(int i = 0; i < n; i++)
{
cnta += vs[a[i % na]][b[i % nb]]; //周期循环
cntb += vs[b[i % nb]][a[i % na]];
}
cout << cnta << " " << cntb << endl;
return 0;
}
代码(xueque)
#include<stdio.h>
int main()
{
long long n,r,l;
long long jr=0,jl=0;
scanf("%lld %lld %lld",&n,&l,&r);
long long L[l+1],R[r+1];
for(long long i=1;i<l+1;i++)
{
scanf("%lld",&L[i]);
}
for(long long i=1;i<r+1;i++)
{
scanf("%lld",&R[i]);
}
long long ll[n+1],rr[n+1];
L[0]=L[l];
R[0]=R[r];
for(long long i=1;i<=n;i++)
{
ll[i]=L[i%l];
rr[i]=R[i%r];
}
for(long long i=1;i<=n;i++)
{
if(ll[i]==0)
{
switch(rr[i])
{
case 1:jr++;break;
case 2:jl++;break;
case 3:jl++;break;
case 4:jr++;break;
}
}
else if(ll[i]==1)
{
switch(rr[i])
{
case 0:jl++;break;
case 2:jr++;break;
case 3:jl++;break;
case 4:jr++;break;
}
}
else if(ll[i]==2)
{
switch(rr[i])
{
case 0:jr++;break;
case 1:jl++;break;
case 3:jr++;break;
case 4:jl++;break;
}
}
else if(ll[i]==3)
{
switch(rr[i])
{
case 0:jr++;break;
case 1:jr++;break;
case 2:jl++;break;
case 4:jl++;break;
}
}
else if(ll[i]==4)
{
switch(rr[i])
{
case 0:jl++;break;
case 1:jl++;break;
case 2:jr++;break;
case 3:jr++;break;
}
}
}
printf("%lld %lld ",jl,jr);
return 0;
}
B 于绝望之中创造希望的yq
用一个字符数组mi记录A到Z对应的密码,遍历已知的密码长度,遇见这个位置没有对应的密码,或有对应的密码但和要输入的不同时停止遍历(停止后为破译失败),若破译成功,则对这个字符数组mi从A到Z位遍历,如果有某一位没有对应密码或与先前对应密码重复停止遍历(停止后位破译失败)。 输出:若先前失败过则failed,若无失败则遍历yq被要求破解的字符串的每一位,输出其在mi中对应的密码。****(yq提供)
代码(yq)
#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=1e7;
char mi[maxn],yuan[maxn],hou[maxn],yq[maxn];
int ceshi[maxn];
int main()
{
for(int i='A';i<='Z';i++){
mi[i]='!';
}
scanf("%s",hou);
scanf("%s",yuan);
scanf("%s",yq);
int len=strlen(yuan),re=1;
for(int i=0;i<len;i++){
// printf("%d ",re);
if(mi[hou[i]]=='!'||mi[hou[i]]==yuan[i]){
mi[hou[i]]=yuan[i];
}else{
re=0;
break;
}
}
if(re!=0){
for(int i='A';i<='Z';i++){
if(mi[i]=='!'||ceshi[mi[i]]!=0){
re=0;
break;
}else{
ceshi[mi[i]]++;
}
}
}
if(re==0){
printf("Failed");
}else{
int len1=strlen(yq);
for(int i=0;i<len1;i++){
printf("%c",mi[yq[i]]);
}
}
return 0;
}
A 4眼鸟还在看蚂蚁感悟人生
本题属于思维题。当两只蚂蚁碰一起时 ,会互相掉头。但是从我们的视角来看。掉头时间不计,也就是两只蚂蚁擦肩而过。这样理解的话,就把问题转化成了一只蚂蚁无障碍下桥,最小值就是每个位置的蚂蚁直接下去的最小值的最大值。最大值同理类推,只需继续算出每只蚂蚁下去的最大时间取最大值即可。****(ZIFEI提供)
代码(ZIFEI)
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100000];
int main()
{
int l,n;
scanf("%d %d",&l,&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int nmax=0;
int nmin=0;
for(int i=1;i<=n;i++)
{
nmin=max(nmin,min(a[i],l-a[i]+1));
nmax=max(nmax,max(a[i],l-a[i]+1));
}
printf("%d %d",nmin,nmax);
}