Codeforces Round #693 (Div. 3) 题解

本文分享了解决四道编程题的思路:切分卡片游戏、公平糖果分配、动态跳跃得分与两人对战游戏。通过实例解析展示了算法应用与博弈理论在简单问题中的实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

蒟蒻又来发题解啦,和队友写题的一天~~

A. Cards for Friends

A题原题戳这里

题目的大致意思:给定宽w长h的卡片,只有当卡片的宽或者长为偶数的时候卡片才能被分成w/2,h不变或者h/2,w不变的卡片;或者h等于1时把卡片分成w个1*1的卡片,w等于1时同样。最后记录卡片最后的个数,与k相比,如果个数没有达到k就输出NO,否则输出YES.(水题~)

题解:

#include<iostream>
using namespace std;
int main(){
	int t;
    cin >> t;
    while(t--){
        int w, h, n;
        long long ans = 1; 
        cin >> w >> h >> n;
        while(w % 2 == 0) ans *= 2, w /= 2;      
        while(h % 2 == 0) ans *= 2, h /= 2;
        
        if(ans >= n) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
    return 0;
}

B. Fair Division

B题原题戳这里

题目的大致意思:有1g和2g的糖果,不能把同一个糖果拆分,问能否将一组糖果分成2组,使得两组糖果质量相等。

解题思路:将所有的糖果质量全部加起来,无非是三种情况,第一种是能够平均分成两组;第二种质量和都不能平均分;第三种糖果个数不能平分而且有质量为1g的糖果
题解:

#include<iostream>
using namespace std;
int main(){
	int t;
    cin >> t;
    while(t--){
        int sum  =0;
        bool f = 0;
		int n;
        cin >> n;
        for(int i = 0; i < n; i++){
            int x;
			cin >> x;
            sum += x;
            if(x == 1) f = 1;
        }
        if(sum %2!=0) cout << "NO" << endl;
        else if(n%2!=0 && !f) cout << "NO" << endl;
        else cout << "YES" << endl;
    }
    
    return 0;
}

C. Long Jumps

C题原题戳这里

题目的大致意思:给定一个数组大小为n的数据,从索引为1开始,求i+a[i]的值,如果i+a[i]>n,分数score=a[i];否则i=i+a[i],前面i+a[i]的和继续加现在的a[i]再比较,score加上a[i],(后面的a[i])如此往复直到i+a[i]的总和能够大于n。(循环求最大值就好)

题解:

#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int t;
    cin >> t;
	while(t--){
		int n;
		cin>>n;
		int a[n+1],Max=0;
		for(int i=1;i<=n;i++) cin>>a[i];
		for(int i = n;i > 0;i--){
  			if(i+a[i]<=n) a[i] += a[i+a[i]];
  			if(a[i] > Max) Max = a[i];
  		}
  		cout << Max << endl;
	}
    return 0;
}

D. Even-Odd Game

D题原题戳这里

题目的大致意思:Alice和Bob对战,每次两个人取走数组中的一个元素,如果Alice取到了偶数就给自己加上相应的分数,如果奇数就不作任何操作;Bob恰好相反。(取走的数字不能再次被取。)比较两者最后的分数,输出谁获胜,如果是平局就输出Tie。

解题思路:博弈思想,应该将数组所有的元素从大到小排序,每次每个人都拿所有数中的最大数,能给自己加分就加给自己,不能也要销毁不能将最大的数字留给对方。
题解:

#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int x, int y) { return x > y; }
int main() {
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		long long a[200001];
		long long Alice = 0, Bob = 0;
		for (int i = 1; i <= n; i++) cin >> a[i];
		sort(a + 1, a + n + 1, cmp);
		for (int i = 1; i <= n; i++) {
			if (i % 2 == 1) {
				if (a[i] % 2 == 0)Alice += a[i];
			}
			else {
				if (a[i] % 2 == 1)Bob += a[i];
			}
		}
		if (Alice > Bob)cout << "Alice" << endl;
		else if (Alice < Bob)cout << "Bob" << endl;
		else cout << "Tie" << endl;
	}
	return 0;
}

总结

题目难度不大,后面的难题以后再补啦~

Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值