240831 第一场入队赛解析

T1:把最小非0数放在第一,剩下的按升序排列即可

	int s;
	cin >>s;
	vector<int> alls;
	while(s){
		alls.push_back(s%10);
		s = s/10;
	}
	sort(alls.begin(),alls.end());
	int a;
	for(int i=0;i<alls.size();i++){
		if(alls[i]!=0){
			a = i;	
			break;
		}
	}
	cout << alls[a];
	for(int i=0;i<alls.size();i++){
		if(i!=a){
			cout << alls[i];
		}
	}
	cout << endl;

T2:很简单的语法题


    int a,b;
	cin >> a >> b;
	cout << 2*a+b<<endl;
	

T3 : n组数,每组两个,每次从第i组任选1个数,最后n组选出的和为x,暴力明显超时,使用dp[i][j]表示前 i 次跳跃后,是否能到达 j 点。

    int n, x; 
    cin >> n >> x;
	f[0][0] = 1;
	for (int i = 1 ; i <= n ; i ++){
		int a, b; 
        cin >> a >> b;
		for (int j = 0 ; j <= N - a ; j ++){
			if (f[i - 1][j]){
                 f[i][j + a] = f[i - 1][j];}     
		}
		for (int j = 0 ; j <= N - b ; j ++){
			if (f[i - 1][j]){
				f[i][j + b] = f[i - 1][j];}       
		}
	}
	if (f[n][x]){
		cout << "YES" << endl;}
	else {
        cout << "NO" << endl;}

T4 : 考虑对于第i个点,只能由第i-1和第i-2个点走到,一个变形的斐波那契数列

    dp[4] = 3;
	dp[5] = 5;
	for(int i=6;i<=30;i++){
		dp[i]=dp[i-1]+dp[i-2];
	}
	while(t--){
		int x;
		cin >>x;
		cout << dp[x] << endl;
	}

T5:赛时考虑复杂了,以为剪去 i-i+k以后,i之前和i+k之后会合并,这样就复杂了,后来发现自己想多了,只需要sort一下1 + n*k即可

    int n,k;
	cin >> n >> k;
	for(int i=1;i<=n;i++){
		cin >> q[i];
	}
	vector<int> alls;
	for(int i=1;i<=n;i+=k){
		if(i>n){
			break;
		}
		else{
			alls.push_back(q[i]);
		}
	}
	sort(alls.begin(),alls.end(),greater<int>());
	cout << alls[0];

T6 :一道大模拟,其实并不难,记得判断是否是同行同列,当时防火墙抽风了,于是有几个if写的比较乱

    int n;
	cin >>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin >> q[i][j];
		}
	}
	int t;
	cin >>t;
	while(t--){
		int w;
		cin >>w;
		if(w==1){
			int x1,x2,x3,y1,y2,y3;
			bool q1 = false,q2=false,q3=false;
			int f = 0;
			cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 ;
			if(q[x1][y1]=='.'){
				q1 = true;f++;
			}
			if(q[x2][y2]=='.'){
				q2 = true;f++;
			}
			if(q[x3][y3]=='.'){
				q3 = true;f++;
			}
			if(x1==x2&&x2==x3||y1==y2&&y2==y3){
				if(f>=2){
					yes;goto loop;
				}
				if(q1){
					if(q[x2][y2]==q[x3][y3]){
						yes;goto loop;
					}
				}
				if(q2){
					if(q[x1][y1]==q[x3][y3]){
						yes;goto loop;
					}
				}
				if(q3){
					if(q[x1][y1]==q[x2][y2]){
						yes;goto loop;
					}
				}
				if(q[x2][y2]==q[x3][y3]&&q[x3][y3]==q[x1][y1]){
					yes;goto loop;
				}
			}
			no;goto loop;
		}
		if(w==2){
			int x,y;
			char c;
			cin >> x >> y >> c;
			q[x][y]= c;
		}
		loop:;
	}
	return 0;

 T7:当时想用前缀和做,后来发现限制在5000内可以暴力解决,模拟即可

    vector<int>alls;
	int n;
	cin >> n;
	string str;
	cin >> str;
	for(int i=0;i<26;i++){
		cin >> v[i];
	}
	int q;
	cin >> q;
	while(q--){
		int op;
		cin >> op;
		if(op==1){
			string s;
			cin >> s;
			str += s;
		}
		if(op == 2){
			int ans = 0;
			for(int i=0;i<str.size();i++){
				ans += v[str[i]-'a'];
			}
			cout << ans << endl;
		}
		if(op == 3){
			int l,r;
			cin >> l >> r;
			string ss = "";
			for(int i=0;i<l-1;i++){
				ss += str[i];
			}
			for(int i=r;i<str.size();i++){
				ss += str[i];
			}
			str = ss;
		}
	}
	
	return 0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值