☰
2025HAUE新生周赛六题解
2026/9/29 8:44:39 网站建设 项目流程

难度分布

签到 D

简单 A B F J

中等 C E G I

困难 H

A⑨的冻青蛙

思路

博弈,如果是3的倍数则后手胜利。如果先手拿1,则后手拿2,如果先手拿2,则后手拿1,后手一定可以取走最后的青蛙。

如果不是3的倍数,先手可以通过取一次青蛙,把青蛙的数量变成3的倍数,随后按照上面的思路把自己当作后手,则先手一定取走最后的青蛙,则先手必胜。

代码

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){intn;cin>>n;if(n%3==0){cout<<"(99)"<<endl;}else{cout<<"QAQ"<<endl;}return0;}

B⑨的切磋

思路

显然不会出现输出あたいってば最強ね!的情况,当做题数相等时输出最强的我下意识地感到了危险,否则输出(99)。

代码

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){intn;cin>>n;intres=0;for(inti=0;i<n;i++){inta,b;charch;cin>>a>>ch>>b;if(ch=='+'){if(a+b==9)res++;}else{if(a-b==9)res++;}}if(res==n)cout<<"最强的我下意识地感到了危险";elsecout<<"(99)";return0;}

COSU!

思路

按照题意遍历数组并记录上一个1的位置。

代码

#include<bits/stdc++.h>usingnamespacestd;voidsolve(){intn,k;cin>>n>>k;string s;cin>>s;intans=0;intlast=-1e9;for(inti=0;i<n;i++){if(s[i]=='1'&&i-last>=k)ans++;if(s[i]=='1')last=i;}cout<<ans<<"\n";}intmain(){ios::sync_with_stdio(false);cin.tie(0);intt;cin>>t;while(t--)solve();}

DCiallo~(∠・ω< )⌒☆

思路

签到题,按照题目要求直接输出即可。

代码

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){for(inti=0;i<721;i++)cout<<"Ciallo~(∠•ω< )⌒☆"<<endl;return0;}

E喵喵的喵喵

思路

前缀和,遍历数组查找最大值即可。

代码

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){intn,k;cin>>n>>k;vector<int>a(n+1);for(inti=1;i<=n;i++)cin>>a[i];a[0]=0;for(inti=1;i<=n;i++)a[i]+=a[i-1];intl=0,r=0,mm=0;for(inti=n;i>=k;i--){if(a[i]-a[i-k]>=mm){mm=a[i]-a[i-k];l=i-k+1;r=i;}}cout<<mm<<endl<<l<<' '<<r<<endl;return0;}

F喵喵的排名(esay)

思路

本题考察结构体排序,用结构体数组把题目的数据储存起来,因为数据量较小,依据题意进行冒泡排序,依照题意输出即可

代码

#include<bits/stdc++.h>usingnamespacestd;structplayer{string name;intkills;intdeaths;intassists;};intcmp(player A,player B){if(A.kills!=B.kills)returnA.kills>B.kills;elseif(A.deaths!=B.deaths)returnA.deaths<B.deaths;elsereturnA.assists>B.assists;}intmain(){intn;cin>>n;vector<player>p;for(inti=0;i<n;i++){string n;inta,b,c;cin>>n>>a>>b>>c;p.push_back({n,a,b,c});}// 冒泡排序for(inti=0;i<n;i++){for(intj=i+1;j<n;j++){// 比较 killsif(p[i].kills<p[j].kills){swap(p[i],p[j]);}elseif(p[i].kills==p[j].kills){// 如果 kills 相同,比较 deathsif(p[i].deaths>p[j].deaths){swap(p[i],p[j]);}elseif(p[i].deaths==p[j].deaths){// 如果 deaths 也相同,比较 assistsif(p[i].assists<p[j].assists){swap(p[i],p[j]);}}}}}for(inti=0;i<n;i++){cout<<p[i].name<<" "<<p[i].kills<<" "<<p[i].deaths<<" "<<p[i].assists<<endl;}}

G喵喵的排名(hard)

思路

本题与F题的差别在于数据量变大了(冒泡排序无法AC),并新增一项字典序排序要求。同样用结构体数组储存题目数据。然后编写cmp函数借助STL库中的sort函数进行自定义排序,最后依题意输出即可

代码

#include<bits/stdc++.h>usingnamespacestd;structplayer{string name;intkills;intdeaths;intassists;};intcmp(player A,player B){if(A.kills!=B.kills)returnA.kills>B.kills;elseif(A.deaths!=B.deaths)returnA.deaths<B.deaths;elseif(A.assists!=B.assists)returnA.assists>B.assists;elsereturnA.name<B.name;}intmain(){intn;cin>>n;vector<player>p;for(inti=0;i<n;i++){string n;inta,b,c;cin>>n>>a>>b>>c;p.push_back({n,a,b,c});}sort(p.begin(),p.end(),cmp);for(inti=0;i<n;i++){cout<<p[i].name<<" "<<p[i].kills<<" "<<p[i].deaths<<" "<<p[i].assists<<endl;}}

H喵喵的网吧

思路

二分做法

对于m块电池最少可以让电脑运行0分钟,最多可以让电脑运行sum分钟(sum:所有电池可以让一台电脑运行的时间总和),则答案必定在这个区间内,且满足单调性,所以我们考虑用二分法来解决这道题目,我们可以假设让n台电脑共同运行x分钟,那么对于让一台电脑运行时间大于等于x的电池,可以让它固定在一台电脑上持续供电,这是对此类电池的最优方案,对于剩余供电时长不满足x分钟的电池,我们可以随意组合,因为换电池不消耗时间,所以只要剩余电池的供电总时长大于等于剩余电脑*x即可满足让n台电脑同时运行x分钟,否则不能。因为可以让n台电脑同时运行x分钟,则必然可以让n台电脑同时运行小于x的时长,只需要向上二分更大的答案看是否成立即可,否则向下二分更小的答案看否成立,最终结果既为正确答案。

代码
#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolcheck(vector<ll>a,ll mid,intn){ll sum=0;for(inti=0;i<a.size();i++){if(a[i]>=mid){n--;}else{sum+=a[i];}}if(sum>=n*mid){returntrue;}returnfalse;}intmain(){intn,m;cin>>n>>m;vector<ll>a(m);ll sum=0;for(inti=0;i<m;i++){cin>>a[i];sum+=a[i];}ll l=0,r=sum,ans=0;while(l<=r){ll mid=(l+r)/2;if(check(a,mid,n)){ans=mid;l=mid+1;}else{r=mid-1;}}cout<<ans<<endl;return0;}

贪心做法

受解法一的启发,我们可以得出如下贪心策略:
记所有电池的电量总和为sum \text{sum}sum,则理论上至多可以供电
x = ⌊ sum n ⌋ x = \left\lfloor \frac{\text{sum}}{n} \right\rfloorx=⌊nsum​⌋
我们对电池电量从大到小排序,然后从电量最大的电池开始遍历:

1.若该电池电量超过x xx,则将其供给一台电脑,问题缩减为n − 1 n-1n−1台电脑的子问题。
2.若该电池电量不超过x xx,则其余电池的电量均不超过x xx,此时有
n ⋅ x = n ⋅ ⌊ sum n ⌋ ≤ sum n \cdot x = n \cdot \left\lfloor \frac{\text{sum}}{n} \right\rfloor \leq \text{sum}n⋅x=n⋅⌊nsum​⌋≤sum
根据解法一的结论,这些电池可以给n nn台电脑供电x xx分钟。
由于随着问题规模减小,x xx单调非增,因此若遍历到一个电量不超过x xx的电池时,可直接返回x xx作为答案。

代码
#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ll n,m;cin>>n>>m;vector<ll>a(m);ll sum=0;for(inti=0;i<m;i++){cin>>a[i];sum+=a[i];}sort(a.begin(),a.end(),greater<ll>());for(inti=0;i<a.size();i++){if(a[i]<sum/n){cout<<sum/n;return0;}n--;sum-=a[i];}return0;}

I喵喵方块

思路

按照题意模拟即可,记录当前最高的位置。

代码

#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){intn,m;cin>>n>>m;inth=0;vector<int>hh(n+1,0);for(inti=1;i<=m;i++){intt,x;cin>>t>>x;if(t==1){if(hh[x]-2>=hh[x+1]){hh[x]++;hh[x+1]=hh[x];}else{hh[x+1]+=3;hh[x]=hh[x+1];}h=max(h,hh[x]);}elseif(t==2){if(hh[x]+1>=hh[x+1]){hh[x]+=2;hh[x+1]=hh[x]+1;}else{hh[x+1]+=2;hh[x]=hh[x+1]-1;}h=max(h,hh[x+1]);}elseif(t==3){if(hh[x]-1>=hh[x+1]&&hh[x]>=hh[x+2]){hh[x]++;hh[x+1]=hh[x]+1;hh[x+2]=hh[x];}elseif(hh[x+1]+1>=hh[x]&&hh[x+1]+1>=hh[x+2]){hh[x+1]+=3;hh[x]=hh[x+1]-1;hh[x+2]=hh[x+1]-1;}elseif(hh[x+2]-1>=hh[x+1]&&hh[x+2]>=hh[x]){hh[x+2]++;hh[x]=hh[x+2];hh[x+1]=hh[x+2]+1;}h=max(h,hh[x+1]);}elseif(t==4){hh[x]+=4;h=max(h,hh[x]);}elseif(t==5){if(hh[x]-1>=hh[x+1]){hh[x]++;hh[x+1]=hh[x]+1;}else{hh[x+1]+=3;hh[x]=hh[x+1]-1;}h=max(h,hh[x+1]);}elseif(t==6){if(hh[x]>=hh[x+1]){hh[x]+=2;hh[x+1]=hh[x];}else{hh[x+1]+=2;hh[x]=hh[x+1];}h=max(h,hh[x]);}}cout<<h<<endl;return0;}

J喵喵喵

思路

遍历字符串,如果遇到标点符号插入miao,注意不要在原字符串中暴力插入后再输出,时间复杂度过高,会导致程序时间超限。

代码

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongsignedmain(){string s;getline(cin,s);for(autoit:s){if(it==','||it=='.'||it=='?'||it=='!')cout<<" miao";cout<<it;}return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询