22-23(1)第1次线上赛
优秀的成绩
跳转链接
要点
注意整除,sum/3进行下取整,因为这题>=90所以下取整没有影响,如果判断的是>90那么就会有错误
应该将判断改为sum/3.0>90
转换为浮点数或者sum>90*3
避免下取整
在做除法时应该十分小心,思考整型下取整有没有影响
代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
bool flag=true;
int sum=0;
for(int i=0;i<3;i++)
{
int x;
scanf("%d",&x);
if(x<85) flag=false;
sum+=x;
}
if(flag&&sum/3.0>=90) cout<<"Excellent"; //注意!!!
else cout<<"Not Excellent";
return 0;
}
英文字母
跳转链接
要点
字母与数字的转换
代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char c;
cin>>c;
char temp;
if(c>='a'&&c<='z') temp='a';
else if(c>='A'&&c<='Z') temp='A';
int i=(int)(c-temp);
for(int j=0;j<26;j++)
{
cout<<(char)(temp+(i+j)%26);
}
return 0;
}
年龄
跳转链接:
要点
起初一直没理解题目"如果生日是2月29日,那么非闰年的年份生日按2月28日算",理解后其实意思就是如果今年不是闰年但是生日是2.29应该看作2.28,如果是今年是闰年那么生日还是2.29
代码
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int y,m,d,ys,ms,ds;
scanf("%d%d%d%d%d%d",&y,&m,&d,&ys,&ms,&ds);
if(!(ys%400==0||ys%4==0&&ys%100!=0)&&m==2&&d==29) d=28;
int ans=ys-y;
if((ms<m||ms==m&&ds<d)) ans--;
printf("%d",ans);
return 0;
}
老人与海
跳转链接
方法一:循环
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int a;
scanf("%d",&a);
int lv=1;
if(a<=49)
lv+=a;
else
{
lv+=49;
a-=49;
int i=2;
while(a>0)
{
lv++;
a-=i;
i++;
}
if(a<0) lv--; //鱼不够等级-1
}
printf("%d",lv);
return 0;
}
方法二:前缀和+二分
前往:前缀和 or 二分
用这个方法主要是想到如果案例数是n的话用方法一会超时
#include<iostream>
#include<cstdio>
using namespace std;
const int N=44722+10; //第447722数时前缀和大于10亿
int s[N];
int main()
{
for(int i=1;i<N;i++) //前缀和下标从1开始避免特判
s[i]=s[i-1]+i+1;
int a;
scanf("%d",&a);
int lv=1;
if(a<=49) lv+=a; //分段
else
{
lv+=49;
a-=49;
int l=1,r=N-1;
while(l<r)
{
int mid=l+r+1>>1;
if(s[mid]<=a) l=mid;
else r=mid-1;
}
lv+=l;
}
printf("%d",lv);
return 0;
}
迷之运算符
跳转链接
要点
- 被除数不能为0,所以在a/b与a%b时先判断b!=0
- a/b是整除的结果,要么转换成浮点型判断,要么先判断a%b==0
- printf输出%时应该写成
printf("%%")
,%需要转义!!!!因为这个坑想了很久,要么可以写成printf("%s","%")
string变量无法使用sacnf输入也不可以用printf输出 (printf输出字符串变量需要.c_str()方法)
字符串相关尽量不要去用scanf和printf!
代码
#include<iostream>
using namespace std;
int main()
{
int a,b,c,n=0;
cin>>a>>b>>c;
if(a+b==c)
{
cout<<"+";
n++;
}
if(a-b==c)
{
if(n>0) cout<<" ";
cout<<"-";
n++;
}
if(a*b==c)
{
if(n>0) cout<<" ";
cout<<"*";
n++;
}
if(b!=0&&a%b==0&&a/b==c)
{
if(n>0) cout<<" ";
cout<<"/";
n++;
}
if(b!=0&&a%b==c)
{
if(n>0) cout<<" ";
cout<<"%";
n++;
}
if(n==0) cout<<"None";
return 0;
}