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;
}