22-23(2)第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;
}

输出-2

跳转链接

3974:输出-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

跳转链接:

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; //确保b一定是因数,退出循环也可能因为a是质数
			else a=1; //a是质数那么那个因数应该是1
		}
	}
	return 0;
}

数列-11

跳转链接

4022:数列-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;
} 

名字和成绩

跳转链接

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

方法二: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

跳转链接

4024:0和1

要点

  1. 常用函数to_string位于头文件<string>中,可以将数值转换成字符串,in、long、double都可以
  2. 常用函数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;
}
posted @ 2023-03-13 20:08  咕噜噜冒泡  阅读(43)  评论(0)    收藏  举报