电子科技大学第十届ACM趣味程序设计竞赛第二场(热身赛)

石子数量奇偶性不会改变

#include <bits/stdc++.h>
using namespace std;

int main (void) {
	int n;
	scanf("%d", &n);
	if (n & 1) printf("Xiaoyu_Chen\n");
	else printf("Yitong_Qin\n");
}

B

字符串前n个相同的字符x不能被合并,答案至少为n。先把之后的x用其他字符合并,再用x把其他字符合并,最后字符串只剩前n个字符,答案为n。

#include <bits/stdc++.h>
using namespace std;

char tex[200010];

int main (void) {
	scanf("%s", tex);
	for (int i = 0; tex[i+1]; i++) {
		if (tex[i] != tex[i+1]) {
			printf("%d", i+1);
			return 0;
		}
	}
	printf("%d\n", strlen(tex));
}

C

不难发现n = 1,2,3,4,5时无解,可以发现n = 6时有(7*7*7-7)/(7+7) = 24,n = 7时有(7+7+7)/7+7+7+7 = 24。对于n >= 8的情况,都可以由之前的可行情况加上*(7/7)得到新的可行情况。

#include <bits/stdc++.h>
using namespace std;

int main (void) {
	int n;
	scanf("%d", &n);
	printf("%s\n", n >= 6 ? "YES" : "NO");
}

D

最终状态为01010...或10101...。考虑达到两种状态所需代价,统计需要变成1的0和变成0的1的个数cnt1和cnt2,那么至少需要max(cnt1,cnt2)的代价。尝试将min(cnt1,cnt2)对01交换,尝试将max(cnt1,cnt2) - min(cnt1,cnt2)剩余0变成1(或是1变成0),这样只需要max(cnt1,cnt2)的代价。

#include <bits/stdc++.h>
using namespace std;

char tex[100010];

int main (void) {
	int n;
	scanf("%d", &n);
	scanf("%s", tex);

	int cnt1 = 0, cnt2 = 0, ans;
	// 010101...
	for (int i = 0; i < n; i++) {
		if (i & 1) cnt1 += (tex[i] != '1');
		else cnt2 += (tex[i] != '0');
	}
	ans = max(cnt1, cnt2);
	cnt1 = cnt2 = 0;
	// 101010...
	for (int i = 0; i < n; i++) {
		if (i & 1) cnt1 += (tex[i] != '0');
		else cnt2 += (tex[i] != '1');
	}
	ans = min(ans, max(cnt1, cnt2));

	printf("%d\n", ans);
}

E

打牌。

多种思路,这里仅提供一种分类方法:

1.先手只有一张牌。

2.先手有两张牌:

2.1.后手有一或两张牌:先手打大牌让后手要不起。

2.2.后手有多张牌:后手一定由大到小打牌,打到倒数第二张被先手接上了先手就胜。

#include <bits/stdc++.h>
using namespace std;

char a[20], b[20];

int convert (char card) {
	if ('3' <= card && card <= '9') return card - '0';
	else if (card == 'T') return 10;
	else if (card == 'J') return 11;
	else if (card == 'Q') return 12;
	else if (card == 'K') return 13;
	else if (card == 'A') return 14;
	else if (card == '2') return 15;
}

bool check (void) {
	int lena = strlen(a), lenb = strlen(b);

	if (lena < 2) return true;

	if (lenb == 1 && convert(b[0]) <= convert(a[1])) {
		return true;
	} else if (lenb == 2 && convert(b[1]) <= convert(a[1])) {
		return true;
	} else if (convert(b[1]) < convert(a[1])) {
		return true;
	}
	return false;
}

int main (void) {
	scanf("%s", a);
	scanf("%s", b);
	printf("%s\n", check() ? "zhong_wang" : "cfeitong"); 
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值