【NEUQ 2022招新赛】题解

1.Win(QAQ)

作为少数的提交第一题超过两次的ACMer,我有必要提醒:要看完题,要看完题,要看完题,要看完题,要看完题,要看完题,要看完题,要看完题,要看完题,要看完题,要看完题,要看完题!

#include<bits/stdc++.h>
using namespace std;
int main(){
	string str;
	cin>>str;
	if(str=="NEU")cout<<"Win"<<endl;
	else if(str=="THU")cout<<"Lose"<<endl;
	else cout<<"?";
	return 0;
} 

2.比大小

思路: 一个一个地比较,运用字符串来存储数据,按位读取。

#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		string str1,str2;
		cin>>str1>>str2;
		if(str1==str2){
			cout<<"="<<endl;
			continue;
		}
		int lena=str1.length();
		int lenb=str2.length();
		int js=0;
		while(str1[js]==str2[js] && js<=lena-1 && js<=lenb-1)js++;
		if(js>lena-1)cout<<"<"<<endl;
		else if(js>lenb-1)cout<<">"<<endl;
		else cout<<(str1[js]>str2[js]?">":"<")<<endl;
	}
	return 0;
} 

3. 矩阵乘法

思路:见题目:

#include<bits/stdc++.h>
using namespace std;
int a[1001][1001],b[1001][1001],N,M,P;
int main(){
	cin>>N>>M>>P;
	for(int i=1;i<=N;i++)for(int j=1;j<=M;j++)cin>>a[i][j];
	for(int i=1;i<=M;i++)for(int j=1;j<=P;j++)cin>>b[i][j];
	for(int i=1;i<=N;i++){
		for(int j=1;j<=P;j++){
			int ans=0;
			for(int k=1;k<=M;k++){
				ans+=a[i][k]*b[k][j];
			}
			cout<<ans<<" "; 
		}
		cout<<endl;
	}
	return 0;
}

4.疯狂星期四(看到此篇博客的人v我50!!!)

思路:一个简单的小模拟,从日月年从小到大开始模拟,从小到大调用数据以免发生错误,并且需要提醒:要想清楚加的数是属于哪个年份/月份的。。。

#include<bits/stdc++.h>
using namespace std;
int cnt=2,M,D,Y;
bool pd(int n){
	if(n%4!=0)return 0;
	else{
		if(n%400==0)return 1;
		else{
			if(n%100==0)return 0;
			else return 1;
		}
	}
}
int ri[12]={31,0,31,30,31,30,31,31,30,31,30,31}; 
int main(){
	cin>>M>>D>>Y;
	//将日期调为11号
	cnt+=D-11;
	//将月份调到10月
	if(M>10){
		while(M!=10){
			M--;
			cnt+=ri[M-1];
		}
	}
	else if(M<10){
		while(M!=10){
			cnt-=(M==2?(pd(Y)?29:28):ri[M-1]);
			M++;
		}
	}
	else ;
	//将年份跳到当前年
	if(Y>2022){
		while(Y!=2022){
			cnt+=(pd(Y)?366:365);
			Y--;
		}
	}
	else if(Y<2022){
		while(Y!=2022){
			Y++;
			cnt-=(pd(Y)?366:365);
		}
	}
	else ;
	while(cnt<0)cnt+=7;
	cnt%=7;
	cout<<cnt<<endl;
	return 0;
	
} 

5.排列.

思路:贪心。

先从左到右,找到能包含第一个maxx的截至位置,再从终止点开始,操作。。。

#include<bits/stdc++.h>
using namespace std;
int n,k,p[1000010],cnt=1,ans=0,maxx=-1e9;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>p[i],maxx=max(maxx,p[i]);
	bool flag=1;
	while(flag){
		if(p[cnt]=maxx)flag=0;
		for(int i=1;i<=k-1;i++){
			cnt++;
			if(p[cnt]=maxx)flag=0;
		}
		ans++;
	}
	while(cnt<n){
		bool flag=0;
		for(int i=1;i<=k;i++){
			if(p[cnt+i]==maxx){
				flag=1;
				break;
			}
		}
		if(flag)cnt=cnt+k;
		else cnt=cnt+k-1;
		ans++;
	}
	cout<<ans;
	return 0;
}

6.小步点。

一道dfs的题。

#include<bits/stdc++.h>
using namespace std;
struct EVA{
	double x,y;
}mapp[6];
double dis[6][6],minn=1e9;
bool book[6];
void dfs(int id,int temp,double DIS){
	if(temp==5){
		minn=min(minn,DIS);
		return ;
	}
	book[id]=1;
	for(int i=1;i<=5;i++){
		if(book[i]==0)dfs(i,temp+1,DIS+dis[i][id]);
	}
	book[id]=0;
}
int main(){
	for(int i=1;i<=5;i++){
		cin>>mapp[i].x>>mapp[i].y;
		for(int j=1;j<=5;j++){
			dis[i][j]=dis[j][i]=sqrt(pow(mapp[i].x-mapp[j].x,2)+pow(mapp[i].y-mapp[j].y,2));
		}
	}
	for(int i=1;i<=5;i++)dfs(i,1,0);
	cout<<fixed<<setprecision(3)<<minn;
	return 0;
}

7.OP生日会。。

(唯一一道不怎么水的题。。为啥我不说)

有a个空(男旅行者)和b个荧(女旅行者)在会场外排队参加原神生日会。不幸的是,会场里只有N个座位,而且已经有若干个派蒙(可以是0个)已经坐在会场里面了。

  • 每个男旅行者都希望坐在他边上的是女旅行者或者派蒙。
  • 每个女旅行者都希望坐在她边上的是男旅行者或者派蒙。

换句话说,男旅行者不希望和其他男旅行者坐一起,女旅行者不希望和其他女旅行者坐一起。

如果会场内没有符合旅行者心意的位置,那么旅行者会选择不参加原神生日会。

思路:

看最多能排入多少个履行者

派蒙的中间分为两种情况。

第一种:座位为偶数。能排入n/2位空,n/2位荧。(对空荧来说都是最佳方案,都不能排入更多)

第二种:座位为奇数。能排入(n-1)/2位空,(n-1)/2位荧,还有一个自由座位,可以坐空或荧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值