2021级HAUT新生周赛(七)@王佳琪专场
A想象之中
注意读题,如果无法击败怪物,怪物会逃跑,所以一定能到终点,直接输出YES即可
C
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while(n--) printf("YES\n");
}
B你是人间四月天
博弈
第一章,四月每次将晚风卡牌移到自己这里,晚风将卡牌移到四月的卡牌堆中,晚风在这一章必胜。
第二章,只有当两人卡牌都只有一张时,四月后手拿牌,晚风第二回合将无卡牌可拿,晚风会失败,其他情况晚风必胜。
第三章,两人卡牌相同,晚风出什么四月就出什么,最终两人分数均为0,晚风胜。
综合三局游戏,只要第二章不是两人卡牌都是1,晚风即可获胜
C
#include<stdio.h>
int main()
{
int count;
int a,b;
int c,d;
int n;
char s[101];
scanf("%d",&count);
while(count--)
{
scanf("%d %d",&a,&b);
scanf("%d %d",&c,&d);
scanf("%d",&n);
scanf("%s",s);
if(c==1&&d==1) printf("April Days\n");
else printf("Night Breeze\n");
}
}
C关键词
枚举
暴力从0123开始查找,查找到9876,区间内必出答案
C
#include<stdio.h>
char s[5][5];
char t[5];
int isok()
{
int cnt;
for(int i=0;i<5;i++)
{
cnt=0;
for(int j=0;j<4;j++)
{
for(int k=0;k<4;k++)
{
if(s[i][k]==t[j])
{
if(j==k) return 0;
cnt++;
}
}
}
if(cnt!=2) return 0;
}
return 1;
}
int main()
{
int temp;
for(int i=0;i<5;i++)
{
scanf("%s",s[i]);
}
for(int i=1;i<10000;i++)
{
temp=i;
for(int j=3;j>=0;j--)
{
t[j]=temp%10+'0';
temp/=10;
}
if(isok())
{
printf("%04d",i);
}
}
}
D爱情废柴
模拟
按照要求模拟即可
C
#include<stdio.h>
int main()
{
int n;
int a,b;
int lack=0,thank=0;
scanf("%d",&n);
scanf("%d",&b);
for(int i=2;i<=n;i++)
{
scanf("%d",&a);
if(a<b)
{
lack=b-a;
}
else if(lack!=0)
{
if(a-b>lack)
{
lack=0;
thank++;
}
else if(a-b==lack)
{
lack=0;
}
else if(a-b<lack)
{
lack-=a-b;
}
}
else if(a>b)
{
thank++;
}
b=a;
}
if(thank==0)
{
printf("Thanks to LF's object!\n");
}
else
{
printf("%d\n",thank);
}
}
E错位时空
概率期望
结果要进行四舍五入
计算时不能计算出最终拿奖率后用100减,在每一个给出拿奖率后要直接转换为打铁率后再进行计算
#include<stdio.h>
int main()
{
int n;
int temp;
double sum;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&temp);
sum += 100 - temp;
}
printf("%.f",sum/n);
}
F年少有为
动态规划,搜索,最短路
动态规划法
从起点递推从起点到这个点的最短距离,推到终点后直接输出结果即可
C
#include<stdio.h>
#include<string.h>
int min(int a,int b)
{
if(a>b) return b;
else return a;
}
int main()
{
int n;
int a[201][201],dp[201];
scanf("%d",&n);
memset(a,127,sizeof(a));
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;i++)
{
dp[i]=a[1][i];
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
dp[i]=min(dp[i],dp[j]+a[j][i]);
}
}
printf("%d",dp[n]);
}
搜索
数据量不大,直接进行暴力搜索
C
#include<stdio.h>
#include<string.h>
int a[201][201];
int ans=1e9;
int n;
void dfs(int step,int money)
{
if(money>=ans) return;
if(step==n)
{
if(money<ans) ans = money;
return;
}
for(int i=step+1;i<=n;i++)
{
dfs(i,money+a[step][i]);
}
}
int main()
{
scanf("%d",&n);
memset(a,127,sizeof(a));
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=2;i<=n;i++)
{
dfs(i,a[1][i]);
}
printf("%d",ans);
}
G交换余生
字符串,进制
先判断输入的是字符串还是整形
然后进行不同的操作
字符串转换为数字需要对进位处进行一些处理
C
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char s[10];
char c[10];
void reverse()
{
char temp;
int len = strlen(c);
for(int i=0;i<len/2;i++)
{
temp=c[i];
c[i]=c[len-i-1];
c[len-i-1]=temp;
}
}
void numtostring()
{
int num=0;
for(int i=0;i<strlen(s);i++)
{
num*=10;
num+=s[i]-'0';
}
memset(c,0,sizeof(c));
int cnt=0;
while(num)
{
if(num%26)
{
c[cnt++]=num%26+'A'-1;
num/=26;
}
else
{
c[cnt++]='Z';
num=num/26-1;
}
}
reverse();
}
void stringtonum()
{
int num=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
num*=26;
num+=s[i]-'A'+1;
}
memset(c,0,sizeof(c));
int cnt=0;
while(num)
{
c[cnt++]=num%10+'0';
num/=10;
}
reverse();
}
int main()
{
while(scanf("%s",s)!=EOF)
{
if(isdigit(s[0]))
{
numtostring();
}
else
{
stringtonum();
}
printf("%s\n",c);
}
}
H突然之间
二分
求一个整数位数可以直接使用对数 log10(x)+1
将x^x带入log10(x)中可以根据数学代换转换为 Xlog10(X)
根据这个式子作为判断条件进行二分搜索答案即可
C
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int l=1,r=2e9;
int mid;
while(l<r)
{
mid=(l+r)/2;
if(mid*log10(mid)+1<n)
{
l=mid+1;
}
else
{
r=mid;
}
}
printf("%d",l);
}
附:赛前预测分析
A,B两道纯签到题,题目较长,应该会前期做出来的人少一些,中期应该会很多人做出来
C题需要有编程模拟的思想,并且处理有一定的难度
D题纯模拟,应该还是能有挺多人做出来
E题挖了个坑,但应该有人还是可以一发过的,难度不高
F题有点考算法,防AK题
G题是经典的进制转换题,难度在这场算中等
H题计划防AK,不仅要想到转换方式,并且二分要写对
应该还是能做到没人AK的~~
榜一应该会是6道题
然后基本也都能把ABD三题做出来
题面最长的最简单,题面最短的最难
难度大致排序: A B E D C G F H
PS:题目名称都是一些歌曲名
欢迎大家听一听~~