ACGO欢乐赛19题解(姗姗来迟了)
2024-04-26 20:28:33
发布于:上海
第一题
读题:
输入How are you!输出Fine!
输入Bye Bye !输出Bye!
思路:
分支语句典型练习,对于新手建议认真做,做完再看题解!
当然坑点就是getline(),否则空格处断开对于我而言只能
***************************
代码:
#include<iostream>
using namespace std;
int main(){
string s;
getline(cin,s);
if(s=="How are you!")cout<<"Fine!";
if(s=="Bye Bye !")cout<<"Bye!";
return 0;
}
第二题
读题:
判断年份是否为闰年
思路:
闰年产生:
地球绕太阳转一圈是一年,地球自转一圈是一天.一年的时间不是整数的天数(这是自然形成的,要是正好是整数天数才怪),而是大约365.24天.因为这个原因,下一年开始的时刻要比上一年提前大约0.24天,这样10年提前2.4天,100年提前24天,过个几百年,季节和月份的关系就要颠倒了,会给人们的生活带来不便,所以要用闰年来解决这个问题.每四年加一天,闰年366天,下一年开始的时刻就又大致回到了原点。
这就是为什么我们说四年一闰 百年不闰 四百年再闰了,就是4的倍数但不是100的倍数的年份或者400的倍数的年份就是闰年的年份
代码:
#include<iostream>
using namespace std;
int main(){
int t;
cin>>t;
if(t%4==0&&t%100!=0||t%400==0)cout<<"YES";
else cout<<"NO";
return 0;
}
第三题:
读题:
给定的h:m:s的时间,求这是第几秒
思路:
时间换算规则:
1h=60m
1m=60s
求高级单位用除法,而求低级单位用乘法,这里1h=(60*60)s
代码:
#include<iostream>
using namespace std;
int a,b,c;
char m,n;
int main(){
cin>>a>>m>>b>>n>>c;
cout<<a*60*60+b*60+c;
return 0;
}
第四题
读题:
给定一个十进制数,转换为二进制说出其中1的个数
思路:
各位见过bitset<n>吗?这是个非常好用的东西
bitset<n>可以定义一个bitset类型的占用n位的二进制数的空间,例如二进制数10011010可以用bitset<8>定义,也可以用bitset<32>,但不可以用bitset<4>,因为这样没开够空间
那么我们可以定义int类型的数,它最大值为2147483647,那么它占位为
1111 1111 1111 1111 1111 1111 1111 1111
最长为32,那么对于109的数据足够了,那么开
#include<bitset>
int t;
bitset<32> bs(t);
这样就可以存储这个整数了。
接下来就是调用bs.to_string()的函数把它转换为字符串类型,那么可以用<algorithm>的count()函数了。
#include<bitset>
#include<algorithm>
...
...
...
int t;
cin>>t;
bitset<32> bs(t);
string s = bs.to_string();
cout<<count(s.begin(),s.end(),'1');
...
代码:
#include<iostream>
#include<bitset>
#include<algorithm>
using namespace std;
int main(){
int t;
cin>>t;
bitset<32> bs(t);
string s=bs.to_string();
cout<<count(s.begin(),s.end(),'1');
return 0;
}
备注:这时我个人的bitset方法,而对于其他像递归的方法也是可以的,不局限于这种方法
第五题
读题:
还原把l写作1,把o写作0的字符串
思路:
其实用不着string,重复读入char类型的variable就可以了
考点很low,还是分支语句做判断
代码:
#include<iostream>
using namespace std;
int main(){
char c;
while(cin>>c){
if(c=='1')cout<<'l';
else if(c=='0')cout<<'o';
else cout<<c;
}
return 0;
}
第六题
读题:
给定一个长度为n的整数序列,求出最大的k个整数,按升序输出
思路:
贪心。
先降序排序,然后逆向遍历这个数组前k项
代码:
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
int s[n];
for(int i=0;i<n;i++)cin>>s[i];
sort(s,s+n,greater<int>());
for(int i=k-1;i>=0;i--)cout<<s[i]<<endl;
return 0;
}
第七题:
读题:
买一送一,问最少多少钱才能买光给定的物品
思路:
贪心。
先排序,然后{
1-双指针 模拟操作,左加加右减减直到左大于右
2-截取前半段用accumulate()的想法,注意导入<numeric>
}
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
int l=0,r=n-1,s[n],c=0;
for(int i=0;i<n;i++)cin>>s[i];
sort(s,s+n);
while(l<=r){
c+=s[l];
l++,r--;
}
cout<<c<<endl;
return 0;
}
当然,我用的是双指针
第八题:
读题:
输出acgo官网网址
思路:
新手看啥,自己做;高手看啥,不会错。
纯粹的输出,连getline的坑都没有,好简单啊
代码:
#include<iostream>
int main(){std::cout<<"www.acgo.cn"<<std::endl;return 0;}
极简代码
全部评论 2
good
2024-04-27 来自 广东
0第7题好像可以不用双指针,直接求前n/2向上取整的元素和就行了
2024-04-27 来自 广东
0
bitset有count方法,直接可以求出所有1的数量。不需要再遍历一遍。
2024-04-26 来自
0
有帮助,赞一个