22-23(1)第1次线上赛

优秀的成绩

跳转链接

3767:优秀的成绩

要点

注意整除,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;
}

英文字母

跳转链接

3766:英文字母

要点

字母与数字的转换

代码

#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;
}

年龄

跳转链接:

3769:年龄

要点

起初一直没理解题目"如果生日是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;
}

老人与海

跳转链接

3764:老人与海

方法一:循环

#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;
} 

迷之运算符

跳转链接

3763:迷之运算符

要点

  • 被除数不能为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;
}
posted @ 2023-03-18 14:48  咕噜噜冒泡  阅读(16)  评论(0编辑  收藏  举报