CodeForce #429 DIV2 A B C题解

A:http://codeforces.com/contest/841/problem/A

题意:n个气球分给k个人,是否有这样的解:每个人手里的气球都颜色不重复

思路:个数最多的颜色个球的个数 >k, 就必然有人手里两个球


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int main(int argc, char *argv[]) {
//	freopen("A.txt", "r", stdin);
	
	int SZ = 26;
	int n,k;
	int num[SZ];
	while(~scanf("%d%d", &n, &k)) {
		memset(num, 0, sizeof(num));
		string s;
		cin >> s;
		for (int i = 0; i < s.size(); i++) {
			num[s[i] - 'a'] += 1;
		}
		int mx = 0;
		for (int i = 0; i < SZ; i++) {
			mx = max(mx, num[i]);
//			cout << num[i] << " " << mx << endl;
		}
//		cout << mx << endl;
		if (mx > (int)(k))
			printf("NO\n");
		else
			printf("YES\n");
	}

	return 0;
}


B:http://codeforces.com/contest/841/problem/B

题意:一个数组,A可以删除和为奇数的连续子串,B可以删除和为偶数的连续子串,不能操作的输,A是先手,问谁赢

思路:

1、如果和为奇数,A一定赢

2、如果和为偶数,那么有两种情况,一是没有奇数,那么A一定输,如果有奇数,那么奇数必然是偶数个。A作为先手,只能取和为奇数的序列,那么剩下的和必然是奇数,而接下来B只能取和为偶数的序列,B取剩下的就和一定是奇数,那么第二轮A就能取完剩下的所有数字,于是A就赢了。

综合来看,只要有奇数出现,B一定会熟


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>

using namespace std;
int main(int argc, char *argv[]) {
	int x, n, r;
	while(~scanf("%d", &n)) {
		r = 2;
		for (int i = 0; i < n; i++) {
			scanf("%d", &x);
			if(x%2) {
				r = 1;
			} 
		}
		if (r == 1) {
			printf("First\n");
		} else {
			printf("Second\n");
		}
	}
	return 0;
}


C:http://codeforces.com/contest/841/problem/C

解很简单,看下example应该都能找到规律。

证明:


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int SIZE = 1e5 *2 +1;

//int A[SIZE];
struct Node {
	int v;
	int idx;
	Node(){}
	Node(int vv, int i) {
		v = vv;
		idx = i;
	}
};

Node A[SIZE];
Node B[SIZE];

bool cmp(const Node a, const Node b) {
	return a.v > b.v;
}

bool cmp2(const Node a, const Node b) {
	return a.v < b.v;
}

bool cmp3(const Node a, const Node b) {
	return a.idx < b.idx;
}

int main() {
//	freopen("A.txt", "r", stdin);
	int m;
	while(~scanf("%d", &m)) {
//		cout << "m:" << m << endl;
		for (int i =0; i < m; i++) {
			scanf("%d", &(A[i].v));
			A[i].idx = i;
		}
		for (int i = 0; i < m; i++) {
			scanf("%d", &(B[i].v));
			B[i].idx = i;
		}
		sort(A, A+m, cmp);
		sort(B, B+m, cmp2);
		
		for (int i = 0; i < m; i++) {
//			cout << "i:" << i << " A:" << A[i].v << "," << A[i].idx << " B:"<< B[i].v << "," << B[i].idx << endl;
			A[i].idx = B[i].idx;
		}
 		
		sort(A, A+m, cmp3);
				
		printf("%d", A[0].v);
		for (int i = 1; i < m; i++) {
			printf(" %d", A[i].v);
		}
		putchar('\n');
	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值