22-23第2次线上赛
Posted 冒泡儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22-23第2次线上赛相关的知识,希望对你有一定的参考价值。
日期-2
跳转链接: 3971:日期-2
要点
- 数组存储每个月对应天数
- 闰年的判断条件:能被400整除或者能被4整除不能被100整除
闰年时二月份为29天,所以一年由365天变为366天
代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
int n;
scanf("%d",&n);
//数组存储月份对应的天数
int mm[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
while(n--)
int y,m,r;
scanf("%d%d%d",&y,&m,&r);
if(y%400==0&&y%3200!=0||y%4==0&&y%100!=0) //是闰年
mm[2]=29;
printf("%d %d\\n",366,mm[m]);
else
mm[2]=28;
printf("%d %d\\n",365,mm[m]);
return 0;
星号阵列-24
跳转链接: 3993:星号阵列-24
要点
- a=1时是一个尴尬的点,所以干脆写入一个死循环,先打印后判断退出
- 因子:能够整除a的整数(可以为负数),题目划定找到小于a的最大因子
优化寻找最小因子b(这里因子都指大于0):
应该从最小的开始找,因为b是a的因子,那么a/b也是a的因子,这题中因为a的值并不大用a--逐个寻找也可以,但是如果a的数值很大就需要这种优化来提升运行速度了
代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
int n;
scanf("%d",&n);
while(n--)
int a;
scanf("%d",&a);
while(true) //死循环
for(int i=0;i<a;i++) printf("*");
puts("");
if(a==1) break; //退出
int b; //因子
for(b=2;b*b<=a;b++)
if(a%b==0) break;
if(a%b==0) a=a/b;
else a=1;
return 0;
名字和成绩
跳转链接: 4027:名字和成绩
要点
sort
函数自定义排序- 扩展:也可以用变量记录更新状态即可
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<string,int> PII; //typedef别名声明
bool mycmp(PII& p1,PII& p2) //自定义排序,取地址避免拷贝速度更快
return p1.second>p2.second;
int main()
vector<PII> vec;
for(int i=0;i<5;i++)
string name;
int score;
cin>>name>>score;
vec.push_back(name,score);
sort(vec.begin(),vec.end(),mycmp);
cout<<vec[2].first<<" "<<vec[2].second<<endl;
return 0;
0和1
跳转链接:4024:0和1
要点
- 常用函数
to_string
位于头文件<string>
中,可以将数值转换成字符串,in、long、double都可以 - 常用函数
find
查找子串
-
find
返回的是unsigned int
无符号正数类型,>=0判断无论如何都会成立。find
是无符号>=右边的0
也是无符号,而find
找不到时返回的是unsigned int
最大值,所以>=0判断永远成立 -
由此我们应该使用
-1
来判断,这样就会将unsigned int
转换成有符号整数 -
等价于-1写法:
string::npos
。npos可以表示string结束位置,即find函数在找不到指定值得情况下会返回string::npos
。
if (s.find("01") !=string::npos|| s.find("10") != string::npos) puts("Yes");
//或者下面这种写法
if (s.find("01") ==string::npos && s.find("10") == string::npos) puts("No");
代码
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
int n;
scanf("%d", &n);
while (n--)
int a, b;
scanf("%d%d", &a, &b);
string s = to_string(a + b);
if (s.find("01") !=string::npos|| s.find("10") != string::npos)
puts("Yes");
else
puts("No");
return 0;
方法二:字符串流
通过字符串流不仅可以将数值转换为字符串,也可以将字符串转换为数值
#include<iostream>
#include<cstdio>
#include <sstream> //stringstream头文件
using namespace std;
int main()
int n;
scanf("%d",&n);
while(n--)
int a,b;
scanf("%d%d",&a,&b);
string str;
stringstream ss; //字符串流
ss<<a+b;
ss>>str;
if(str.find("01")!=-1||str.find("10")!=-1) puts("Yes");
else puts("No");
return 0;
以上是关于22-23第2次线上赛的主要内容,如果未能解决你的问题,请参考以下文章
ciscn2021 ctf线上赛baby.bc wp(#超详细,带逆向新手走过一个又一个小坑)