Codeforces Round #436 (Div. 2)

A

判断只有两种数字并且他们的数量是相等的

By _sasuke, contest: Codeforces Round #436 (Div. 2), problem: (A) Fair Game, Accepted, #

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e9 + 10;
map<int, int>  mp;

int main(){
	int n;	scanf("%d", &n);
	for(int i = 0; i < n; ++i) {
		int x;	scanf("%d", &x);
		mp[x]++;
	}
	map<int, int>::iterator it1, it2;
	it1 = mp.begin();
	it2 = mp.begin();
	it2++;
	if(mp.size() == 2) {
		if(it1->second == it2->second) {
			puts("YES");
			printf("%d %d\n", it1->first, it2->first);
		} else {
			puts("NO");
		}
	} else {
		puts("NO");
	}
	return 0;
}

B

求某个区间内不包含大写字母并且小写字母的不同的个数最大

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e9 + 10;
char st[qq];
map<char, bool> mp;

int main(){
	int n;	scanf("%d", &n);
	scanf("%s", st + 1);
	int ans = 0;
	for(int i = 1; i <= n; ++i) {
		for(int j = i; j <= n; ++j) {
			mp.clear();
			bool f = false;
			for(int k = i; k <= j; ++k) {
				if(st[k] >= 'A' && st[k] <= 'Z') {
					f = true;
					continue;
				}
				mp[st[k]] = true;
			}
			if(!f)
				ans = max(ans, (int)mp.size());
		}
	}
	printf("%d\n", ans);
	return 0;
}

C

题意:坐标0到a, bus的油箱容量为b,刚开始是满油,0和a之间有个点f是加油站,从0到a是一个journey,a到0也是一个journey,最开始在位置0,问进行k个journey最小需要加几次油,不可以输出-1

思路:首先判断f > b,先把车移动到加油站,然后在去进行journey,这一步模拟即可,最后一个journey的时候特判即可

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 1e5 + 10;
const LL INF = 1e9 + 10;
LL a, b, f, k;

int main(){
	scanf("%lld%lld%lld%lld", &a, &b, &f, &k);
	if(f > b) {
		puts("-1");
		return 0;
	}
/*	if(k == 1) {
		if(b >= a)	puts("0");
		else puts("1");
		return 0;
	}
	if(k == 2) {
		if(b >= a * 2) {
			puts("0");
		} else if(b )
	}
	if(f > b || f * 2 > b || (a - f) * 2 > b) {
		puts("-1");
		return 0;
	}*/
	LL cur = b - f;
	int cnt = 0;
	bool flag = true;
	for(int i = 1; i <= k; ++i) {
		if(i == k) {
			if(i % 2 == 1) {
				if(b < a - f)	flag = false;
				if(cur < (a - f))	cnt++;
			} else {
				if(b < f)	flag = false;
				if(cur < f)	cnt++;
			}
			break;
		}
		if(i % 2 == 1) {
			if(b < (a - f) * 2)	flag = false;
			if(cur >= (a - f) * 2)	cur -= (a - f) * 2;
			else	cur = b, cur -= (a - f) * 2, cnt++;
		} else {
			if(b < f * 2)	flag = false;
			if(cur >= f * 2)	cur -= (f * 2);
			else	cur = b, cur -= f * 2, cnt++;
		}
	//	if(!f)	break;
		if(!flag)	break;
	}
	if(!flag) {
		puts("-1");
		return 0;
	}
	printf("%d\n", cnt);
	return 0;
}

D

题意:给出n个数,要求把这n个数变成1~n,变化次数要最小,然后保证字典序最小

思路:首先可以知道最小变化次数一定是1~n中没有出现的数字个数,然后把这些数放进优先队列里面,从左向右扫保证最小字典序

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>

using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b)	memset(a, b, sizeof a)
#define REP(i, x, n)	for(int i = x; i <= n; ++i)
const int MOD = 1e9 + 7;
const int qq = 2e5 + 10;
const LL INF = 1e9 + 10;
int n;
int num[qq];
int vis[qq];
bool ishas[qq];
priority_queue<int, vector<int>, greater<> > Q;
priority_queue<int> P;

int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i) {
		scanf("%d", num + i);
		vis[num[i]]++;
	}
	int cnt = 0;
	for(int i = 1; i <= n; ++i) {
		if(vis[i] == 0)	Q.push(i), cnt++;
	}
	for(int i = 1; i <= n; ++i) {
		if(vis[num[i]] > 1) {
			if(num[i] < Q.top()) {
				if(!ishas[num[i]]){
					ishas[num[i]] = true;
					continue;
				}
			}
			vis[num[i]]--;
			num[i] = Q.top();
			Q.pop();
		}
	}
	printf("%d\n", cnt);
	for(int i = 1; i <= n; ++i) {
		printf("%d ", num[i]);
	}
	puts("");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值