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


这场比赛里面出到了很多 模拟的题,都是需要很多的时间去写,主要考察到了代码的实现能力,与codeforces里面的题有些差距。codeforces打多了还是有点不习惯的。题挺好的,尤其是H题感觉很考代码实现能力与STL的使用熟练度。多写写这样的题还是对我们很有好处的。只不过前三题都太水了,没有一点难度

原题链接

点击跳转牛客,进行奇妙冒险🐂

A.国际旅行Ⅰ

题意:

给出一段序列,求里面第k小的数

思路:

直接排序求值(没有一点难度)

代码:

void solve () {
	int n,m,q;cin>>n>>m>>q;
	for (int i=1;i<=n;i++) {
		cin>>a[i];
	}int x,y;
	sort(a+1,a+1+n);
	for (int i=1;i<=m;i++) {
		cin>>x>>y;
	}int p;
	for (int i=1;i<=q;i++) {
		cin>>p;
		cout<<a[p]<<'\n';
	}
}

接下来登场的就更是一道逆天题了

F.水灵灵的学弟

题意:

博弈题,但是两个人名字一样,直接输出他们的名字就行了

思路:

没有思路,直接写

代码

void solve () {
int t;cin>>t;
while (t--) {
int x,y;cin>>x>>y;
cout<<"DHY"<<'\n'
}
}

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

题意:

在给出的一串字符串里面找有几个“chuan”

思路:

用find函数直接找,找到了之后再往后找,直到find为-1的时候停止

代码:

void solve () {
    int n;cin>>n;
    string s;cin>>s;
    int x=0,cnt=0;
    while (1) {
        x=s.find("chuan");
        if (x==-1) {
            break;
        }
        cnt++;
        s.erase(x,5);
         
    }
    cout<<cnt;
}

J.这是签到

题意:

给出n×m的序列,按照题意求出最小的行列式的大小

思路:

此题无方思路茫,暴力求解泪两行。

代码:

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 ma=min(n,m);int ans=INT_MAX;
	for (int i=1;i<=ma;i++) {
		if (i==1) {
			ans=min(a[1][1],ans);
		}
		if (i==2) {
			int t=a[1][1]*a[2][2]-a[1][2]*a[2][1];
			ans=min(ans,t);
		}
		if (i==3) {
			int t1=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 t2=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];
			ans=min(ans,t1-t2);
//			cout<<t1<<' '<<t2<<' ';
		}
		if (i==4) {
			int t1=a[1][1]*a[2][2]*a[3][3]*a[4][4]+a[1][2]*a[2][3]*a[4][1]*a[3][4]+a[1][4]*a[2][1]*a[3][2]*a[4][3]+a[1][3]*a[2][4]*a[3][1]*a[4][2];
			int t2=a[1][4]*a[2][3]*a[3][2]*a[4][1]+a[1][3]*a[2][2]*a[3][1]*a[4][4]+a[2][4]*a[3][3]*a[4][2]*a[1][1]+a[1][2]*a[2][1]*a[3][4]*a[4][3];
			int ans=t1-t2;
			ans=min(ans,t1-t2);
		}
		if (i==5) {
			int t1=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];
			int t2=a[1][5]*a[2][4]*a[3][3]*a[4][2]*a[5][1]+a[1][4]*a[2][3]*a[3][2]*a[4][1]*a[5][5]+a[1][3]*a[2][2]*a[3][1]*a[4][5]*a[5][4]+a[1][2]*a[2][1]*a[3][5]*a[4][4]*a[5][3]+a[1][1]*a[2][5]*a[3][4]*a[4][3]*a[5][2];
			int ans=t1-t2;
			ans=min(ans,t1-t2);
		}
	}
	if (m!=n) {
		if (ans>0) cout<<"0";
		else cout<<ans; 
	}
	else
	cout<<ans;
}

范围那么小,不就是留着给我暴力打表的吗

H.狼狼的备忘录

题意:

给出很多信息,给它们整理起来,最后按要求输出

思路:

用map<string,set< string > > ;将每个人的信息存入相应的数组set里面,再在set里面对不符合要求的给删掉。每个人的名字是字符串s,每个人的信息是str刚开始mp[s].size()的大小如果是零的话,一定往里面存入东西,然后里面如果不为0,就要遍历这个set,用for (auto t : mp[s]),如果t长的话,就判断str是不是为t的后缀,如果遍历完了都没有找到后缀的话,就把str存入里面,就执行mp[s].insert(str)。如果str长的话,就要把原set里面的东西选择性的删掉,那么删谁呢?就要遍历这个set找到谁是str的后缀,然后给它删掉,用erase函数是实现,最后再按要求输出map里面的东西就可以了。

代码

void solve () {
	map<string,set<string> >mp;
	int n;cin>>n;
	for (int i=1;i<=n;i++) {
		string s;cin>>s;
		int q;cin>>q;
		for (int j=1;j<=q;j++) {
			string str;cin>>str;
			int flag=1;
			if (mp[s].size()==0) mp[s].insert(str);
			else {
				vector<string> v;
				for (auto t:mp[s]) {
					if (t.size()>=str.size()) {
						int k=t.rfind(str);
						if (k!=-1&&k+str.size()==t.size()) flag=0; 
					}
					else {
						int k=str.rfind(t);
						if (k!=-1&&k+t.size()==str.size()) v.push_back(t);
					}
				}
				if (flag) mp[s].insert(str);
				if (v.size())
				for (auto t : v) {
					mp[s].erase(t);
				}
			} 
		}
	}
	int ans1=mp.size();cout<<ans1<<'\n';
	for (auto t1 : mp) {
		cout<<t1.fi<<' '<<mp[t1.fi].size()<<' ';
		for (auto t2 : mp[t1.fi]) {
			cout<<t2<<' ';
		}
		 cout<<'\n';
	}
	
}

D.A*BBBB

题意:

两个非常大的数字相乘求结果python过不了

思路:

将两个数字用字符串输入,因为b它字符都一样,所以我们可以根据乘法的性质
在这里插入图片描述
例如这样,模拟几下,利用乘法的性质,将代码模拟出来即可,有些难度,比较难代码实现

void solve () {
	string x,y;cin>>x>>y;
	reverse(ALL(x));
	string ans;int t=0,t1=0;
	for (int i=0;i<x.size()+y.size();i++) {
		if (i<x.size())
		t+=(x[i]-'0');
		if(i-y.size()>=0&&i-y.size()<x.size()) 
		t-=(x[i-y.size()]-'0');
		t1+=t*(y[0]-'0');
		ans.push_back(t1%10+'0');
		t1/=10;
	} 
	while (ans.size()>1&&ans.back()=='0') ans.pop_back();
	reverse(ALL(ans));
	cout<<ans<<'\n';
}
  • 23
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值