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

1.A 国际旅行1

因为是从第一个国家到第 k少的国家,且保证各个国家之间可以相互到达,且m>=n-1 那么说明这些国家是连在一起的,我们可以用一个数组存储,把这些国家存里面最后再排序

#include<bits/stdc++.h>
using namespace std;
int x[1005];
int a[1005],b[1005];
int main(){
	ios::sync_with_stdio,cin.tie(0),cout.tie(0);
	int m,n,q;
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int u,v,j=1;
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		if(!x[u]){
			b[j++]=a[u];
			x[u]=1;
		}
		if(!x[v]){
			b[j++]=a[v];
			x[v]=1;
		}
	}
	
	sort(b+1,b+j);
	int i;
	while(q--){
		cin>>i;
		cout<<b[i]<<endl;
	}
}

 2. J 这是签到

这题可以直接用行列式公式进行计算,因为数组最大为 5*5的,所以可以把所有计算列出来,行列式计算方法为 1内元素相乘+ 2内元素相乘+3内元素相乘+...5内元素相乘

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
#define fi first
#define se second
#define PII pair<int,int> 
#define lowbit(x) ((x)&(-x))
#define ULL unsigned long long
using namespace std;
const int N=1e4+5;
int a[10][10];
void solve(){
	int n,m;
	cin >> n >> m;
	for(int i=1;i<=n;++i)
	   for(int j=1;j<=m;++j){
	   	cin >> a[i][j];
	   }
	int minn=a[1][1];
	if(n==1&&m==1){
		cout << minn << endl;
		return ;
	}
	int k=a[1][1]*a[2][2]-a[1][2]*a[2][1];
	minn=min(k,minn);
	if(n<=2&&m<=2){
		cout << minn << endl;
		return ;
	}
	int k1=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];
	int k2=a[1][3]*a[2][2]*a[3][1]+a[1][1]*a[2][3]*a[3][2]+a[1][2]*a[2][1]*a[3][3];
	minn=min(minn,k1-k2);
	if(n<=3&&m<=3){
		cout << minn << endl;
		return ;
	}
	k1=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][4]*a[2][1]*a[3][2]*a[4][3]+a[1][3]*a[2][4]*a[3][1]*a[4][2];
	k2=a[1][4]*a[2][3]*a[3][2]*a[4][1]+a[1][1]*a[2][4]*a[3][3]*a[4][2]+a[1][3]*a[2][2]*a[4][4]*a[3][1]+a[1][2]*a[2][1]*a[3][4]*a[4][3];
	minn=min(minn,k1-k2);
	if(n<=4&&m<=4){
		cout << minn << endl;
		return ;
	}
	k1=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[5][1]*a[4][5]+a[1][5]*a[2][1]*a[3][2]*a[4][3]*a[5][4]+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];
	k2=a[1][5]*a[2][4]*a[3][3]*a[4][2]*a[5][1]+a[1][1]*a[2][5]*a[3][4]*a[4][3]*a[5][2]+a[1][4]*a[2][3]*a[5][5]*a[3][2]*a[4][1]+a[1][2]*a[2][1]*a[3][5]*a[4][4]*a[5][3]+a[1][3]*a[2][2]*a[3][1]*a[4][5]*a[5][4];
	minn=min(minn,k1-k2);
	cout << minn << endl;
	return ;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	//cin >> t;
	while(t--) solve();
	// cout << fixed;//强制以小数形式显示
    // cout << setprecision(n); //保留n位小数
	return 0;
}

3.H 狼狼的备忘录

这题就是一个大模拟题,刚开始用的结构体出现了各种各样的错误,而且有点逻辑不清晰,看来还是要多练练逻辑,用一个map存数据,因为map内部自动排序,比较方便。我们只需要判断有没有重复的后缀

#include<bits/stdc++.h>
using namespace std;
map<string,vector<string> > q;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		int t;
		cin>>t;
		while(t--){
			string a;
			cin>>a;
			string tm=a;
			reverse(tm.begin(),tm.end());
			int f=0;
			for(int j=0;j<q[s].size();j++){
				string tt=q[s][j];
				reverse(tt.begin(),tt.end());
				int fg=0;
				for(int k=0;k<min(tm.size(),tt.size());k++){
					if(tm[k]!=tt[k]) fg=1;
				}
				if(fg==0){
					f=1;
					if(tt.size()<tm.size()){
						q[s][j]=a;
					}
				}
			}
			if(f==0) q[s].push_back(a);
			
			}
		}
		cout<<q.size()<<endl;
			for(auto i:q){
				cout<<i.first<<' ';
				vector<string> res=i.second;
				sort(res.begin(),res.end());
				unique(res.begin(),res.end());
				cout<<res.size()<<' ';
				for(auto j:res){
					cout<<j<<' ';
				}
				cout<<endl;
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值