8VC Venture Cup 2017 - Elimination Round

A

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <cstdlib>
#include <string>
using namespace std;

typedef long long ll;
const int qq = 1e5 + 10;
ll num[qq];
ll n, m, k;

int main(){
	cin >> n;
	if(n == 1){
		cout << 3 << endl;
		return 0;
	} else if(n == 2){
		cout << 4 << endl;
		return 0;
	}
	for(ll i = 1; i <= 1000; ++i){
		int ans = i * n + 1;
		for(int j = 2; j <= sqrt(ans) + 1; ++j){
			if(ans % j == 0){
				cout << i << endl;
				return 0;
			}
		}
	}
	return 0;
}

B

题意:给出n,m 表示每个人拥有的单词数, 然后给出每个人的单词, 现在从第一个人开始每次说一个自己有单词, 不能出现重复的, 谁说不了了就输了

思路: map统计每个人的单词有多少个(去重), 然后统计两个人中相同的单词有多少个,  那么根据最优策略, 每个人肯定是要尽可能多的说出一个对方有点单词, 很显然 如果相同单词是偶数个 那么就平分就可以, 如果是奇数个, 那么第一个就会多说一个单词 , 换衣句话说就是对方少了一个单词. 最后比较两个人剩下单词的大小即可

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <cstdlib>
#include <string>
using namespace std;

typedef long long ll;
const int qq = 1e3 + 10;
ll num[qq];
ll n, m, k;
map<string, int> mp1, mp2;

int main(){
	cin >> n >> m;
	string x;
	int a, b, c;
	a = b = c = 0;
	for(int i = 0; i < n; ++i){
		cin >> x;
		if(mp1[x] == 1)	continue;
		mp1[x] = 1;
		a++;
	}
	for(int i = 0; i < m; ++i){
		cin >> x;
		if(mp2[x] == 1)		continue;
		if(mp1[x] == 1)	    c++;
		mp2[x] = 1;
		b++;
	}
	if(c % 2 == 1){
		a  = a - c/2;
		b = b - c/2 - 1;
	} else {
		a = a - c/2;
		b = b - c/2;
	}
	if(a > b) {
		cout << "YES" << endl;
	} else {
		cout << "NO" << endl;
	}
	return 0;
}

C

题意: n个点, 表示距离结点 i 最远的亲戚是 pi, 求有多少课树

思路:先将一个结点为一棵树的筛出来, 剩下的结点可以直接求联通块的个数, 相加就是答案

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <cstdlib>
#include <string>
using namespace std;

typedef long long ll;
const int qq = 1e5 + 10;
ll num[qq];
ll n, m, k;
vector<int> v;
int pre[qq];

int find(int x){
	return pre[x] == x ? x: pre[x] = find(pre[x]);
}

int main(){
	cin >> n;
	int cnt = 0;
	for(int i = 1; i <= n; ++i){
		cin >> num[i];
		if(num[i] == i) {
			cnt++;
		}
	}
	for(int i = 0; i <= n; ++i) pre[i] = i;
	for(int i = 1; i <= n; ++i){
		if(i == num[i]){
			pre[i] = -1;
			continue;
		}
		int a = find(i), b = find(num[i]);
		if(a != b){
			pre[b] = a;
		}
	}
	for(int i = 1; i <= n; ++i)
		if(pre[i] == i){
			cnt++;
		}
	cout << cnt << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值