CF496D——Tennis Game(高效,模拟)

来源:互联网 发布:滴滴大数据平台 编辑:程序博客网 时间:2024/06/05 00:42

Tennis Game

#include <algorithm>#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <map>#define INF 0x7fffffffusing namespace std;const int MOD = 1e9 + 7;const int N = 1e5 + 10;int n;int where[2][N];int cnt[2];int main() {    scanf("%d", &n);    int x;    for(int i = 0; i < n; i++) {        scanf("%d", &x); x--;        where[x][++cnt[x]] = i;    }    vector <pair<int , int> > ans;    for(int i = 1; i <= max(cnt[0], cnt[1]); i++) {        int cur = 0;        int win1 = 0, win0 = 0, last;        int sofar0 = 0, sofar1 = 0;        while(cur < n) {            int p0 = sofar0 + i > cnt[0] ? n : where[0][sofar0 + i];            int p1 = sofar1 + i > cnt[1] ? n : where[1][sofar1 + i];            int p = min(p1, p0);            if(p == n) {                break;            } else if(p == p0) {                cur = p;                sofar0 += i;                sofar1 = cur + 1 - sofar0;                last = 0;                win0++;            } else {                cur = p;                sofar1 += i;                sofar0 = cur + 1 - sofar1;                last = 1;                win1++;            }        }        if(cur != n - 1) continue;        if(win0 == win1) continue;        if(last == 1 && win0 < win1)            ans.push_back(make_pair(win1, i));        else if(last == 0 && win0 > win1)            ans.push_back(make_pair(win0, i));    }    sort(ans.begin(), ans.end());    printf("%d\n", ans.size());    for(int i = 0; i < ans.size(); i++) {        printf("%d %d\n", ans[i].first, ans[i].second);    }    return 0;}


0 0
原创粉丝点击