Codeforces Round #436 (Div. 2)

来源:互联网 发布:网络销售公司简介 编辑:程序博客网 时间:2024/06/13 15:57

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;elsecur = b, cur -= (a - f) * 2, cnt++;} else {if(b < f * 2)flag = false;if(cur >= f * 2)cur -= (f * 2);elsecur = 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;}