河南萌新联赛2024第(二)场:南阳理工学院

avatar
作者
猴君
阅读量:0

文章目录

链接

链接

A. 国际旅行Ⅰ

题意与思路

这是一个签到题,输入的城市的值排序,然后按他给的顺序输出就行了

代码

#include <bits/stdc++.h> #define int long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; int a[1010]; signed main() { 	IOS 	int T=1; 	//cin>>T; 	while(T--) 	{ 		int n,m,q,c,b,d; 		cin>>n>>m>>q; 		for(int i=1;i<=n;i++) 		{ 			cin>>a[i]; 		} 		sort(a+1,a+1+n); 		for(int i=1;i<=m;i++) 		cin>>c>>d; 		while(q--) 		{ 			cin>>b; 			cout<<a[b]<<endl; 		} 	} 	return 0; } 

D.A*BBBB

题意与思路

这个题就是两个大数相乘,我么们可以找一下规律看下图
在这里插入图片描述
因为b的每一位都相同上图是第一个样例乘2得到的,可以看出中间的数值是一样的所以,就可以把这看成一种规律来写

代码

#include<bits/stdc++.h> using namespace std;  typedef long long ll; const int N=2e6+10;  void solve() {     string a,b;     cin>>a; 	cin>>b;     //cout<<a<<' '<<b<<endl;     if(a.length()==1&&a[0]-'0'==0)     {         cout<<0<<endl;         return;     }     ll c[N],ans[N];     memset(c,0,sizeof c);     memset(ans,0,sizeof ans);     ll lc=0;     for(ll i=a.length()-1;i>=0;i--)     {         c[a.length()-i-1]=a[i]-'0';         lc++; 		//d[a.length()-i-1]=a[i];     }     ll bb=b[0]-'0';     if(bb==0)     {         cout<<0<<endl;         return;     }     ll t=0;     //c[strlen(c)]='0';     for(ll i=0;i<lc;i++)     {         ll s=c[i]*bb+t;         c[i]=s%10;         t=s/10;     }     if(t!=0)     {         c[lc]=t;         lc++;     }     for(ll i=1;i<lc;i++) c[i]+=c[i-1];     ll cc=0,tt=0; 	for(ll i=0;i<lc+b.length();i++)     {     	if(i<lc) ans[i]=c[i];     	else ans[i]=c[lc-1]; 		if(i>=b.length()) ans[i]-=c[i-b.length()];	 	} 	//for(int i=0;i<lc+b.length();i++) cout<<ans[i]<<' '; 	//cout<<endl; 	//t=0;     ll lans=0;     t=0; 	for(ll i=0;i<lc+b.length();i++) 	{         //if(t==0&&ans[i]==0) break; 		t+=ans[i]; 		ans[i]=t%10; 		//ans[i+1]+=t/10;         t/=10;         lans++; 	}     while(t!=0)     {         ans[lans++]=t%10;         t/=10;     } 	ll f=0; 	for(ll i=lans;i>=0;i--) 	{ 		if(f==0&&ans[i]==0) continue; 		else if(f==0&&ans[i]!=0) 		{ 			f=1; 		} 		cout<<ans[i]; 	 } //cout<<ans[i]<<' '; 	cout<<endl; }  int main() {     int t;     cin>>t;     while(t--) solve();  } 

F.水灵灵的小学弟

题意与思路

这个题目意思是个博弈题,但博弈是一点没考,他说谁赢输出谁的名字首拼大写,但题目上两个名字首拼相同,所以不管输入什么,都输出首拼就行

代码

#include <bits/stdc++.h> #define int long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; int a[1010]; signed main() { 	IOS 	int T=1; 	cin>>T; 	while(T--) 	{ 		int a,b; 		cin>>a>>b; 		cout<<"DHY"<<endl; 	} 	return 0; } 

H.狼狼的备忘录

题意与思路

这个题就是,给你几行信息每行有名字和信息,让名字相同的合并在一起,但如果一个人有两个信息,一个信息是另一个的后缀就不用保留后缀的那个信息了,如果信息相等就随便舍去一个,我的思路就是把信息都存在一个map嵌套set容器中,然后把相同人的信息存到一个set里面,让后用rfind函数去找是否有后缀,如果有就删除,反之就添加到set里

代码

#include <bits/stdc++.h> #define int long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; map<string,set<string>>ma; signed main() { 	IOS 	int T=1; 	cin>>T; 	while(T--) 	{ 		string s,a; 		int n; 		cin>>s>>n; 		while(n--) 		{ 			int f=0; 			cin>>a; 			if(ma[s].size()==0) 		       ma[s].insert(a); 		    else 		    { 		    	vector<string>v; 		    	for(auto i:ma[s]) 		    	{ 		    		if(i.size()>=a.size()) 		    		{ 		    			if(i.rfind(a)!=-1&&i.rfind(a)+a.size()==i.size()) 						f=1; 					} 					else 					{ 						if(a.rfind(i)!=-1&&a.rfind(i)+i.size()==a.size())                             v.push_back(i); 					} 				} 				if(f==0) 				ma[s].insert(a); 				if(v.size()) 				{                     ma[s].insert(a); 					for(auto x:v) 					{ 						ma[s].erase(x); 					} 				} 			}         } 	} 	cout<<ma.size()<<endl; 	for(auto x:ma) 	{ 		cout<<x.first<<" "<<ma[x.first].size()<<" "; 		for(auto y:ma[x.first]) 		{ 			cout<<y<<" "; 		} 		cout<<endl; 	} 	return 0; }  

I.重生之zbk要拿回属于他的一切

题意与思路

这个题目就是给你一个字符串让你求他有几个“chuan”字 串,我们可以每次截取5个字符判断是否与“chuan”

代码

#include <bits/stdc++.h> #define int long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std;  signed main() { 	IOS 	int T=1; 	//cin>>T; 	while(T--) 	{ 		string s,b="chuan"; 		int n,sum=0; 		cin>>n>>s; 		for(int i=0;i<s.size();i++) 		{ 			string a=s.substr(i,5); 			if(b==a) 			sum++; 		} 		cout<<sum<<endl; 	} 	return 0; } 

J.这是签到

题意与思路

这个题就是给你n行m列的矩形,求(1,1)到(n,n)的行列式,如果给你(3,4)就把第四行全部补0,列不够也是如此
我的思路就是纯暴力,因为范围最大就是5,所以把1到5的行列式全列出来就行了

代码

#include <bits/stdc++.h> #define int long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; int a[10][10]; signed main() { 	IOS 	int T=1; 	//cin>>T; 	while(T--) 	{ 		int m,n,mi=1e9,t; 		cin>>m>>n; 		int k=max(m,n); 		for(int i=1;i<=m;i++) 		{ 			for(int j=1;j<=n;j++) 			{ 				cin>>a[i][j]; 			} 		} 		mi=min(mi,a[1][1]); 		if(k==1) 		{ 			cout<<mi<<endl; 			return 0; 		} 		mi=min(mi,a[1][1]*a[2][2]-a[1][2]*a[2][1]); 		if(k==2) 		{ 			cout<<mi<<endl; 			return 0; 		} 		t=a[1][1]*a[2][2]*a[3][3]+ 		a[1][2]*a[2][3]*a[3][1]+ 		a[1][3]*a[2][1]*a[3][2]- 		a[1][3]*a[2][2]*a[3][1]- 		a[2][3]*a[3][2]*a[1][1]- 		a[3][3]*a[1][2]*a[2][1]; 		mi=min(mi,t); 		if(k==3) 		{ 			cout<<mi<<endl; 			return 0; 		} 		t=a[1][1]*a[2][2]*a[3][3]*a[4][4]+ 		a[1][2]*a[2][3]*a[3][4]*a[4][1]+ 		a[1][3]*a[2][4]*a[3][1]*a[4][2]+ 		a[1][4]*a[2][1]*a[3][2]*a[4][3]- 		a[1][4]*a[2][3]*a[3][2]*a[4][1]- 		a[2][4]*a[3][3]*a[4][2]*a[1][1]- 		a[3][4]*a[4][3]*a[1][2]*a[2][1]- 		a[4][4]*a[1][3]*a[2][2]*a[3][1]; 		mi=min(mi,t); 		if(k==4) 		{ 			cout<<mi<<endl; 			return 0; 		} 		t=a[1][1]*a[2][2]*a[3][3]*a[4][4]*a[5][5]+ 		a[1][2]*a[2][3]*a[3][4]*a[4][5]*a[5][1]+ 		a[1][3]*a[2][4]*a[3][5]*a[4][1]*a[5][2]+ 		a[1][4]*a[2][5]*a[3][1]*a[4][2]*a[5][3]+ 		a[1][5]*a[2][1]*a[3][2]*a[4][3]*a[5][4]- 		a[1][5]*a[2][4]*a[3][3]*a[4][2]*a[5][1]- 		a[2][5]*a[3][4]*a[4][3]*a[5][2]*a[1][1]- 		a[3][5]*a[4][4]*a[5][3]*a[1][2]*a[2][1]- 		a[4][5]*a[5][4]*a[2][2]*a[1][3]*a[3][1]- 		a[1][4]*a[4][1]*a[2][3]*a[3][2]*a[5][5]; 		mi=min(mi,t); 		cout<<mi<<endl; 	} 	return 0; } 

总结

这一次比赛中间的题都是大模拟,用stl容器比较多,而我stl用的不好导致模拟题没写出来,当时连两个容器一起怎么遍历都不知道,别说写了,赛后我要好好学一下容器,要不然只用数组对于一些大模拟题太吃亏了

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!