河南联赛(六)补4题

B-百变吗喽_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)

 思路:首先遍历一遍s和t,找出两字符串的不同之处,如果不同的地方大于一个输出0,不同的地方只有一个时从不同处往回找,如果前一个与t【i】相同,说明t【i-1】也可以看作不同的字符,解决方案加一。不断向前找,直到出现不同的字符结束查找。将找到的位置记录,输出总的大小然后从小到大输出。

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
//int x[9]={0,1,0,1,-1,0,-1,1,-1}; 
//int y[9]={0,0,1,1,0,-1,-1,-1,1};
struct position{
	int po;
	char ch;	
};
bool cmp(position a,position b){
	return a.po<b.po;	
}

void solve(){
	string s;
	cin>>s;
	int lens=s.size();
	string t;
	cin>>t;
	int lent=t.size();
	int pos=-1;
	int flag=1;
		for(int i=0;i<lent;i++){
			if(pos==-1){
				if(s[i]!=t[i]){
					pos=i;
				}
			}else{
				if(s[i-1]!=t[i]){
					flag=0;
					break;
				}
			}
		
		}
		vector<position> results;
		if(flag==1){
			for(int i=pos;i>=0;i--){
				if(t[i]==t[pos]){
					position pn;
					pn.ch=t[i];
					pn.po=i;
					results.emplace_back(pn);
				}else{
					break;
				}
			}
		}else{
			cout<<"0"<<endl;
			return;
		}
		int xx= results.size() ;
		 cout << results.size() << endl;
		 sort(results.begin(),results.end(),cmp);
		 for (const auto& result : results) {
        cout << result.po << " " << result.ch << endl;
    }
	
}
signed main() {
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}

	return 0;
}

做题时一直超时因为想着用strsub,但忘记strsub的时间复杂度为on,叠加在一个for循环里导致时间复杂度变为on的平方,超时了。

II-正义从不打背身_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)​​​​​​​

思路:这一题有点像模拟题,要找出反转的规律,首先可以先把前m个数据进行180度旋转的判断,然后再对位置进行调整,经过举例发现规律,前m个中,第一个一定是position【m】,然后减二的去输出,然后判断从一还是二开始下一轮的循环,我们将前m个循环结束后,再看m+1到n的状态。

代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
//int x[9]={0,1,0,1,-1,0,-1,1,-1}; 
//int y[9]={0,0,1,1,0,-1,-1,-1,1};
void solve(){
	int n,m;
	cin>>n>>m;
	char ch;
    int position[2000005];
    for(int i=1;i<=n;i++){
        cin>>ch;
        if(ch=='P'){
            position[i]=1;
        }else{
            position[i]=-1;
        }
    }
    for(int i=1;i<=n;i++){
    	if((m-i+1)%2==1){
    		position[i]*=-1;
		}
	}
	for(int i=m;i>0;i-=2){
		if(position[i]==-1)cout<<"0 ";
		else{
			cout<<"1 ";
		}
	}
	int start=0;
	if(m%2==0){
		start=1;
	}else{
		start=2;
	}
	for(int i=start;i<=m;i+=2){
		if(position[i]==-1)cout<<"0 ";
		else{
			cout<<"1 ";
		}
	}
	for(int i=m+1;i<=n;i++){
		if(position[i]==-1)cout<<"0 ";
		else{
			cout<<"1 ";
		}
	}
}
signed main() {
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}

	return 0;
}

C-16进制世界_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)

思路:这是一道很经典的背包问题,只是加上了一些约束,但用动态规划思想可以做出。设立dp[i][j]表示 饱食度为i时余数为j的食用数量,我们最终取dp[m][0]为最终答案。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int v[N], w[N];
int dp[N][20];
void slove()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> v[i] >> w[i];
		w[i] = w[i] % 16;
	}
	int maxx = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j=m;j>=v[i];j--)
		{
			for (int k = 15; k >= 0; k--)
			{
				if (k != 0 && !dp[j - v[i]][k])
					continue;
				dp[j][(k + w[i]) % 16] = max(dp[j][(k + w[i]) % 16], dp[j - v[i]][k] + 1);
			}
		}
	}
	cout << dp[m][0] << "\n";
}
signed main()
{
	int t=1;
	//cin >> t;
	while (t--)
	{
		slove();
	}
}

L-koala的程序_河南萌新联赛2024第(六)场:郑州大学 (nowcoder.com)

 思路:原本的代码想要解决的是约瑟夫环问题,接着就有点套模板然后加上题目的一点点条件.

代码:

#include<iostream>
#include<deque>
using namespace std;
deque<int> res;
int n, k;
int main()
{
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		res.push_back(i);
	}
	int cnt = 0,pos=0;
	while (res.size()>1)
	{
        pos=(pos+k-1)%res.size();
		cout << res[pos] << " ";
		res.erase(res.begin()+pos);
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值