22-23(2)第2次线上赛
日期-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;
}
输出-2
跳转链接
要点
int为4个字节数据类型,4Byte=32bit,其中有一位表示符号位,那么int表示范围 -2的31次方 ~ 2的31次方-1,约正负21亿
代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>b) printf("%d\n",a-b);
else printf("%d\n",b-a);
}
return 0;
}
星号阵列-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; //确保b一定是因数,退出循环也可能因为a是质数
else a=1; //a是质数那么那个因数应该是1
}
}
return 0;
}
数列-11
跳转链接
要点
-
内存计算
a 数组约占用39062KB(1e74/1024),p数组约占用162KB,s数组约占用5192KB(6645798/1024),不会爆内存 -
埃氏筛测质数+前缀和
用埃氏筛测质数法得出1000万以内质数,并得出1000万以内质数个数为664579(包括了第一项是0,方便前缀和的使用),保存前缀和(开longlong) -
二分法
二分查找小于m的第一个质数,即得到m的前缀和
代码
#include<iostream>
using namespace std;
const int N=1e7,V=664579;
bool a[N+10]; //true不是质数,false是质数 ,下标表示数值
int p[V+1];
long long int s[V+10];
int main()
{
a[0]=true,a[1]=true;
for(int i=2;i*i<=N;i++)
{
if(!a[i])
{
for(int j=i*i;j<=N;j+=i)
a[j]=true;
}
}
int dex=0;
for(int i=0;i<=N;i++)
if(!a[i])
{
dex++;
p[dex]=i;
s[dex]=s[dex-1]+i;
}
int n;
cin>>n;
while(n--)
{
int m,a;
scanf("%d%d",&m,&a);
int l=0,r=V;
while(l<r)
{
int mid=l+r+1>>1;
if(p[mid]<m) l=mid;
else r=mid-1;
}
long long int ans=0;
if(a>=l+1)
{
ans=m+s[l]+(a-1-l);
}
else
{
ans=m+s[l]-s[l+1-a];
}
printf("%lld\n",ans);
}
return 0;
}
名字和成绩
跳转链接
要点
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;
}
方法二:map
利用map自动排序
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
multimap<int,string>m;
int main()
{
for(int i=0;i<5;i++)
{
string a;
int b;
cin>>a>>b;
m.insert({b,a});
}
auto it=m.begin();
for(int i=0;i<=1;i++)
it++;
cout<<it->second<<" "<<it->first;
return 0;
}
0和1
跳转链接
要点
- 常用函数
to_string位于头文件<string>中,可以将数值转换成字符串,in、long、double都可以 - 常用函数
find查找子串
find返回的是unsigned int无符号正数类型,>=0判断无论如何都会成立,因为find是无符号>=右边的0也是无符号。find找不到时返回unsigned int最大值,所以>=0判断永远成立
代码
#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;
}

浙公网安备 33010602011771号