S15192
一、题目报告
第一题100分,第二题100分,第三题100分,第四题100分。
二、赛中概况
第一题很简单,遍历删除一下就可以。
第二题不难,设一个cnt数组统计一下就行。
第三题模拟下就可以。
第四题,见过类似的,所以直接AC。
三、解题报告
T1.咪咪的玩具(toy)
题目情况
比赛时AC
题目描述
咪咪今年 5 岁了,爸爸送给他几套lego玩具的零件 m 个,零件由不同型号(一个型号只有一个零件)组成,现在咪咪想要用这些零件组成一些模型,但是,咪咪比较任性,他会将带有不喜欢的数字的零件扔掉,比如他不喜欢数字 3 ,那他就会把型号为 3、13、23、30、33… 等零件去掉。现在给定 m 和 t ,求咪咪扔掉之后还剩多少个零件。
题目解析
观察数据范围,可以发现数据范围并不大。
因此可以直接枚举 到 范围内的每个数字,然后对这个数字进行拆分,若不包含 t ,则进行计数,然后继续判断下一个数字。
最终记录出来的就是不包含 t 的数字,直接输出就是答案。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
int main(){
freopen("toy.in","r",stdin);
freopen("toy.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
int t=i,f=0;
while(t!=0){
if(t%10==m){
f=1;
break;
}
t/=10;
}
if(!f) cnt++;
}
cout<<cnt<<"\n";
fclose(stdin);
fclose(stdout);
return 0;
}
T2.小可的晚会(party)
题目情况
比赛时AC
题目描述
小可全班同学要去超市买东西,小可一共有 n 个同学,每个人要买 m 件商品。现在我们想要比一比谁花的钱最多,花了多少钱。输出是第几个人,以及他花的钱数(如果一样多则按照先算的优先)。
题目解析
计算出来每行数字的和,然后找出最大的和,并输出行标。使用计数器直接记录即可。然后打擂台记录最大值。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a[108][108],cnt[108],maxx,t;
int main(){
freopen("party.in","r",stdin);
freopen("party.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
cnt[i]+=a[i][j];
}
}
for(int i=1;i<=n;i++){
if(maxx<cnt[i]){
maxx=cnt[i];
t=i;
}
}
cout<<t<<" "<<maxx<<"\n";
fclose(stdin);
fclose(stdout);
return 0;
}
T3.蓄水池水管问题(pipe)
题目情况
比赛时AC
题目描述
蓄水池有甲、丙两条进水管和乙、丁两条排水管。
要灌满一池水,单开甲管需要a小时,单开丙管需要c小时;要排光一池水,单开乙管需要b小时,单开丁管需要d小时。
现在池内没有水,如果按甲乙丙丁的顺序循环单开各水管,每次每管开1小时,则多长时间后水开始溢出水池?
保证一定会在有限时间内出现水溢出水池的情况。
题目解析
循环让两个人分别倒水,进行记录,注意计算过程中的精度问题。
提前判断 如果进水后超过1 ,那么时间累计的是剩余水量/进水速度
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d;
cin>>a>>b>>c>>d;
//进水>排水
//进水量 假设池满是1
double sum=0,t=0;
while(sum<1){
if(sum+1.0/a>=1){//提前判断 如果进水后超过1
t+=(1-sum)/(1.0/a);//剩余水量/进水速度
break;
}
sum+=1.0/a;//进水
sum-=1.0/b;//出水
t+=2;//累计 时长
if(sum+1.0/c>=1){//提前判断 如果当即进水后超过1
t+=(1-sum)/(1.0/c);
break;
}
sum+=1.0/c;//加上 进水量
sum-=1.0/d;//减去 出水量
t+=2;
}
printf("%.2lf",t);
return 0;
}
T4.石头剪刀布(game)
题目情况
比赛时AC
题目描述
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?
题目解析
输赢的判断过程有多种方式,可以直接枚举判断,情况并不多,也可以通过自定义函数,判断输赢。枚举情况判断:
if(a[i%na]==5&&b[i%nb]==0) cnta++;
else if(a[i%na]==0&&b[i%nb]==2) cnta++;
else if(a[i%na]==2&&b[i%nb]==5) cnta++;
else if(b[i%nb]==5&&a[i%na]==0) cntb++;
else if(b[i%nb]==0&&a[i%na]==2) cntb++;
else if(b[i%nb]==2&&a[i%na]==5) cntb++;
出石头剪刀布的过程是循环进行的,因此,需要进行取余,取余之后,表示一轮循环结束,重新开始。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,na,nb,cnta,cntb;
int a[108],b[108];
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
cin>>n>>na>>nb;
for(int i=1;i<=na;i++){
cin>>a[i];
}
for(int i=1;i<=nb;i++){
cin>>b[i];
}
a[0]=a[na],b[0]=b[nb];
for(int i=1;i<=n;i++){
if(a[i%na]==5&&b[i%nb]==0) cnta++;
else if(a[i%na]==0&&b[i%nb]==2) cnta++;
else if(a[i%na]==2&&b[i%nb]==5) cnta++;
else if(b[i%nb]==5&&a[i%na]==0) cntb++;
else if(b[i%nb]==0&&a[i%na]==2) cntb++;
else if(b[i%nb]==2&&a[i%na]==5) cntb++;
}
if(cnta==cntb){
cout<<"draw\n";
}else if(cnta>cntb){
cout<<"A\n";
}else if(cnta<cntb){
cout<<"B\n";
}
fclose(stdin);
fclose(stdout);
return 0;
}
2024/10/12
标签:AC,题目,报告,int,sum,补题,i%,nb,模拟 From: https://blog.csdn.net/LXY130519/article/details/143232740