AtCoder Regular Contest 087

C

记录每个数字出现的次数,最后再加加减减算一算就行了。

#include<map>
#include<cstdio>
#include<iostream>
using namespace std;
map < int , int > a;
int main() {
    int n, ans = 0; scanf("%d", &n);
    for (int t; n--;)
        scanf("%d", &t), ++a[t];
    for (map < int , int > :: iterator it = a.begin(); it != a.end(); ++it) {
        if (it->second < it->first) ans += it->second;
        else if (it->second > it->first) ans += it->second - it->first;
    } printf("%d\n", ans);
    return 0;
}

D

比赛的时候一直WA最后三个点,后来看editorial才发现是因为我第一步处理错了。

#include<cstring>
#include<queue>
#include<bitset>
#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
char s[10000];
int p[2], n;
vector < int > d[2];
bitset < 30000 > inq;
bool check(int k) {
    queue < int > q, q2; q.push(0); inq.reset();
    for (int i = 0; i < d[k].size(); ++i, swap(q, q2))
        for (int u, v; !q.empty();) {
            u = q.front(); q.pop(); inq[u+10000] = 0;
            v = u + d[k][i];
            if (!inq[v+10000]) q2.push(v), inq[v+10000] = 1;
            v = u - d[k][i];
            if (!inq[v+10000]) q2.push(v), inq[v+10000] = 1;
        }
    for (; !q.empty(); q.pop())
        if (q.front() == p[k]) return true;
    return false;
}
int main() {
    scanf("%s", s);
    scanf("%d%d", &p[0], &p[1]);
    n = strlen(s);
    for (int fir = 1, m = 0, i = 0, t = 0; i < n; ++i) {
        if (s[i] == 'F') ++m;
        if (s[i] == 'T' || i == n - 1) {
            if (fir) p[0] -= m, m = fir = 0; //就是这里
            if (m) d[t].push_back(m);
            m = 0, t ^= 1;
        }
    } puts(check(0) && check(1) ? "Yes" : "No");
    return 0;
}

EF以后再补。

posted @ 2017-12-17 13:42  p0ny  阅读(396)  评论(0编辑  收藏  举报