ACGO欢乐赛25题解(全)
2024-08-21 07:26:46
发布于:上海
第一题:
读题:
要输出int
上限。
思路:
如果背出来的话可以直接输出,否则的话可以使用<limits>
库中的numeric_limits<int>::max()
函数来求解。
代码:
#include<iostream>
using namespace std;
int main(){
cout<<2147483647<<endl;
return 0;
}//预计得分:100pts
或者:
#include<iostream>
#include<limits>
using namespace std;
int main(){
cout<<numeric_limits<int>::max();
return 0;
}
第二题:
读题:
计算A除以B余数。
思路:
直接使用取余运算符即可。
代码:
#include<iostream>
using namespace std;
int a,b;
int main(){
cin>>a>>b;
cout<<a%b;
return 0;
}//预计得分:100pts
第三题:
读题:
小鱼连续第 i 天打卡获得 i 经验值,问至少多少天连续打卡可以达到 K 经验值?
思路:
输入 K ,然后用循环累加连续读 i 天获得的经验值,判断是否达到 K 经验值。
代码:
#include<iostream>
using namespace std;
int main(){
int k;
cin>>k;
int s=0,i;
for(i=1;;i++){
s+=i;
if(s>=k){
cout<<i;
return 0;
}
}
}//预计得分:100pts
第四题:
读题:
判断给定形式如year-month-date
的日期是否合法。
思路:
这道题判断条件有些多:
- 判断年份是否在闭区间 [1971, 2100] 之间,如果不是输出
YES
- 判断月份是否在闭区间 [1, 12] 之间,如果不是输出
YES
- 如果月份为1、3、5、7、8、10、12月:
判断日期是否在闭区间 [1, 31] 之间,如果不是输出
YES
,否则输出NO
- 如果月份为4、6、9、11月:
判断日期是否在闭区间 [1, 30] 之间,如果不是输出
YES
,否则输出NO
- 如果是2月:
判断年份是否为闰年(即年份为4的倍数却不是100的倍数或者年份为400的倍数)
如果是闰年,那么判断日期是否在闭区间 [1, 29] 之间,如果不是输出
YES
,否则输出NO
如果是平年,那么判断日期是否在闭区间 [1, 28] 之间,如果不是输出
YES
,否则输出NO
代码:
#include<iostream>
using namespace std;
long long y,m,d;
char a,b;
int main(){
cin>>y>>a>>m>>b>>d;
if(y<1971||y>2100)cout<<"YES";
else if(m<1||m>12)cout<<"YES";
else{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
if(d>0&&d<=31)cout<<"NO";
else cout<<"YES";
}
else if(m==4||m==6||m==9||m==11){
if(d>0&&d<=30)cout<<"NO";
else cout<<"YES";
}
else{
if(y%4==0&&y%100!=0||y%400==0){
if(d>0&&d<=29)cout<<"NO";
else cout<<"YES";
}
else{
if(d>0&&d<=28)cout<<"NO";
else cout<<"YES";
}
}
}
return 0;
}//预计得分:100pts
第五题:
读题:
给出未来一周天气,格式为最低温 最高温 是否天晴
,其中最后一个用Y/N表示,Y表示晴天,N表示雨天;要求找到晴天中最高温度最低的那天;若最高温度相同,要找到其中最低温度最低的那天;若最低温度也相同,则找到其中最靠前的那天。如果找不到,输出-1。
思路:
结构体排序。用结构体存储一天的信息,结构体成员有:最高温、最低温、是否天晴(type bool)、未来第几天(name id)。
先把晴天放在雨天前,再把其中最高温度低的放在最高温度高的前面,接着把其中最低温度低的放在最低温度高的前面,最后把其中距离“今天”近的放到远的前面,这样即可完成排序。
这样完成排序后,保证数组中第一个结构体元素的id输出即可。输出-1的情况只有一种:就是全部为N(雨天)的情况,这样排完序首个元素的成员也是N,只要看首个元素是否有为N的成员,有则输出-1,没有则输出id。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int h,l;
bool a;
int id;
}tree[7];
bool cmp(node a,node b){
if(a.a!=b.a)return a.a;
if(a.h!=b.h)return a.h<b.h;
if(a.l!=b.l)return a.l<b.l;
return a.id<b.id;
}char c;
int main(){
for(int i=0;i<7;i++){
cin>>tree[i].l>>tree[i].h>>c;
tree[i].a=c=='Y';
tree[i].id=i;
}sort(tree,tree+7,cmp);
if(!tree[0].a)cout<<-1;
else cout<<tree[0].id+1;
return 0;
}//预计得分:100pts
第六题:
读题:
判断一个字符串是否为 回文串 或 更好的回文串 ,是则输出YES,不是输出NO。
定义:
更好的回文串
对于一个字符串来说,如果删去其中所有的数字,若得到一个回文串,则该字符被视为 更好的回文串 。
(没有数字字符后是回文串的字符串就是 更好的回文串 )
思路:
先输入原字符串,然后进行备份,在备份上进行加工处理删除数字字符。接着(你可以用双指针来判断是否为回文串,但是还有更粗暴的方法)直接把两个字符串逆序后和原来相比,如果其中有一组是相等的,输出YES,否则输出NO。
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s1,s2,rs1,rs2;//s1备份为rs1逆序,s2备份为rs2逆序
char c;
int main(){
while(cin>>c){
s1+=c;
if(!(c>=48&&c<=57))s2+=c;
}
rs1=s1,rs2=s2;
reverse(rs1.begin(),rs1.end());
reverse(rs2.begin(),rs2.end());
if(s1==rs1||s2==rs2)cout<<"YES";
else cout<<"NO";
return 0;
}//预计得分:100pts
第七题:
读题:
走廊上有0~29这30盏关着的灯,有一个变量s=0。当第 i 盏灯亮起时,s+=2i;当第 i 盏灯熄灭时,s-=2i。询问每次操作后的s值为多少。
思路:
可以用一个长度为30的bool类型数组存储30盏灯状态,0表示熄灭,1表示点亮。每次操作后进行相应改变,即取反,然后将s执行相应操作即可。
代码:
#include<iostream>
#include<cmath>
using namespace std;
bool open[30];
long long s=0;
int t,i;
int main(){
cin>>t;
while(t--){
cin>>i;
open[i]=!open[i];
if(open[i])s+=(long long)pow(2.0,i);
else s-=(long long)pow(2.0,i);
cout<<s<<endl;
}
return 0;
}//预计得分:100pts
第八题:
读题:
判断一个数是否为 快乐数 ,是输出YES,不是输出NO。
定义:
快乐数
将一个非负整数替换为各个数位上的数的平方之和,重复这个过程,如果最终能够变成1则为快乐数,如果进入无限循环则不是。
思路:
为了避免没有标记地模拟导致陷入无限循环TLE,我们可以像广度优先搜索一样建立bool类型标记数组vis(abbr. visited),0代表没有变换到过当前数,1代表已经变换成(过)了当前数。如果一个数a进行上述操作又变成了数a(a≠1),那么此时应当发现vis[a]=1,这个数此时陷入了无限循环,应当停止输出NO。
【样例解释】
1,输出YES
7——72=49——42+92=97——92+72=130——12+32+02=10——12+02=1,输出YES
13——12+32=10——12+02=1,输出YES
2——2(重复,陷入无限循环,因此不是快乐数),输出NO
代码:
#include<iostream>
using namespace std;
const int N=1e6+10;
bool vis[N],f=0;
int n;
int hp(int x){
int p=0;
while(x){
p+=(x%10)*(x%10);
x/=10;
}
return p;
}
int main(){
cin>>n;
while(1){
if(n==1){
cout<<"YES";
break;
}
else if(vis[n]){
cout<<"NO";
break;
}
else{
vis[n]=1;
n=hp(n);
}
}
return 0;
}//预计得分:100pts
这里空空如也
有帮助,赞一个