开始: 2024-07-07 14:30:00

20240707

结束: 2024-07-07 17:30:00
当前: 2025-0505-3030 11:47:37  类型:单人排位赛 状态:已经结束 

A-ISBN号码

#include<bits/stdc++.h>
using namespace std;
char s[50];
int sum,t;
int main()
{
scanf("%s",s);
for(int i=0;i<12;i++)//从0枚举到11 因为最后一位是识别码
{
if(s[i]=='-') continue;
t++;//需要乘的数++
sum+=(s[i]-'0')*t;//将字符转换为数字再*t
}
sum%=11;//答案对11取模
if(sum==10) //单独判断一下X
{
if(s[12]=='X') printf("Right");
else
{
s[12]='X';//把最后一位修改后再输出
printf("%s",s);
}
}
else //其他情况最后一位都是数字 可以一起判断
{
if(s[12]-'0'==sum) printf("Right");
else
{
s[12]=sum+'0';
printf("%s",s);
}
}
return 0;
}

B-模拟赛

#include<bits/stdc++.h>
using namespace std;
int n, m, k, tot[1004], vis[1004][1004], a[1004][1004];
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
int t=a[i][j];//第i位同学要在第t天做第j套题
//vis[i][j]==1表示第i天有人要做第j套题
if(!vis[t][j]) //如果第j题没有在第t天开比赛
{
vis[t][j] = 1;
tot[t]++; //第t天要多开一场比赛
}
}
}
for(int i = 1; i <= k; i++)//共k天 输出每天的tot
printf("%d ", tot[i]);
return 0;
}

C-打卡

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mp[205][205];//邻接矩阵
ll vis[205];
int main()
{
ll n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
ll s,e,num;
scanf("%lld%lld%lld",&s,&e,&num);
mp[s][e]=num;
mp[e][s]=num;
}
ll k,nm,number=0,mm=0x3f3f3f3f,nn;
cin>>k;
for(int p=1;p<=k;p++) //检验k种方案
{
for(int i=0;i<205;i++) vis[i]=0; //初始化每个点都没走过
ll ans,flag=0,vi=0,pre=0; //pre==0表示一开始在家
nm=0;
cin>>ans; //该方案中的景点数
for(int i=1;i<=ans;i++)
{
ll ve;
cin>>ve;
vis[ve]++; //这个景点走了一次
nm++; //现在共走了nm个景点
if(nm>n) flag=1; //有重复景点
if(vis[ve]>1) flag=1; //有重复景点
if(mp[pre][ve]) vi+=mp[pre][ve]; //如果有边就加上花费 否则不符合要求
else flag=1; //没有边
pre=ve; //当前在pre这个点
}
if(mp[pre][0]) vi+=mp[pre][0];//加上回家的花费
else flag=1; //无法回家
if(!flag&&nm==n) //!flag表示没有非法情况,nm==n表示正好每个景点打卡一次
{
number++; //满足要求的方案数+1
if(mm>vi)
{
mm=vi; //最优方案的花费
nn=p; //最优方案的编号
}
}

}
cout<<number<<endl;
if(number) cout<<nn<<" "<<mm<<endl;
return 0;
}

D-密码学

思路:
1.(特例分析)L = 3 时 aaa --- zzz ,单个位置a ---- z,碰到 z 时本位变回a , 更高一位的字母 + 1

2. 其实这是一个进制问题,只不过这里是26进制。可以将a看为0,z看为9,那就转为了我们很熟悉的十进制了,即类似于序列里存着从1,2,3,......,998,999的数字。

3.“以 1 为步长递增” ,同10进制一样,都是加到最小一位“满了”就进位。

#include<bits/stdc++.h>
using namespace std;
int main()
{
int l, n;
cin >> l >> n;
int sum = pow(26, l); // 若 l = 3 则每位都有 26 * 26 * 26 = 26 ^ 3 种可能
int k = sum - n; // 倒数第N个 调成正着(第 k 个)比较好理解 1 加了 k 次
char ans[10] = { 0 }; // 答案存入
for (int i = l - 1; i >= 0; i--) // 从最低位开始
{
// 类比 10进位 会很好理解
ans[i] = k % 26 + 'a'; // + 'a' 转成字母
k /= 26; // 进到前一位
}
cout << ans << endl; // 打印
return 0;
}

E-两只牛

#include<bits/stdc++.h>
using namespace std;
const int dx[4]={-1,0,1,0};//上、右、下、左四个方向
const int dy[4]={0,1,0,-1};
int cx,cy,ct;//记录奶牛的坐标和方向
int fx,fy,ft;//记录约翰的坐标和方向
bool f[21][21],v[21][21][4][21][21][4];//f表示地图是否能走,v表示这种情况是否有出现过
void search()
{
int k=0;//当前分钟数
while(1)
{
if(cx==fx && cy==fy)//如果抓到了牛
{
printf("%d\n",k);//输出
exit(0);
}
if(v[fx][fy][ft][cx][cy][ct])//如果这种情况出现过 证明进入死循环
{
printf("0\n");
exit(0);
}
v[fx][fy][ft][cx][cy][ct]=1;//把这种情况设置为出现过
//找奶牛的方向
if(f[cx+dx[ct]][cy+dy[ct]]==false)//如果这个方向不能走
{
ct++;
ct%=4;
}
else cx=cx+dx[ct],cy=cy+dy[ct];//如果可以走就走
//找john的方向
if(f[fx+dx[ft]][fy+dy[ft]]==false)
{
ft++;
ft%=4;
}
else fx=fx+dx[ft],fy=fy+dy[ft];
k++;
}
}
int main()
{
char st[21];
//一开始f数组均为false 现在把能走的地方确定
for(int i=1;i<=10;i++)
{
scanf("%s",st+1);//输入
for(int j=1;j<=10;j++)
{
if(st[j]=='.') f[i][j]=true;//如果能走
if(st[j]=='F') fx=i,fy=j,f[i][j]=true;//如果是john
if(st[j]=='C') cx=i,cy=j,f[i][j]=true;//如果是牛
}
}
ct=ft=0;//一开始是向上
search();//开始搜索
return 0;
}