Codeforces Round #443 (Div. 2) B. Table Tennis 879B
啊啊啊啊啊啊 做的时候太天真了……一开始的直觉是对的……orz后来想多了,pretest还过了orz没想到啊orz,竟然wa了……
一开始被k的大小迷惑了……根本就不用管呐,k>n的话,必然是序列中最大值的赢,k<n的话就循环判断谁的逆序数(或者逆序数+1)最先达到k
(啊……其实就都按k<n写,直到到最大值了还没有赢k局的就……直接输出最大值……)
其实……就是求逆序数的感觉??稍微变化一下……每次输的人往后排……那power最大的那个人排到第一位以后就一直都是他赢了啊,
也就是说最多1个循环,局势就稳定了,emmmmm然后就暴力一下……记录一下逆序数,需要注意,当i跟j比,i输的时候j要记得+1啊……
#include<iostream> #include<algorithm> #include<string> #include<string.h> #include<stdio.h> using namespace std; typedef long long ll; ll n, a[1005],b[1005],k; int main() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; memset(b, 0, sizeof(b)); int i = 0; while(i<n) { int j; for (j = i+1; j < n; j++) { if (a[i] < a[j]) { b[a[j]]++; break; } else b[a[i]]++; } if (b[a[i]] >= k) //i先赢k局 { cout << a[i] << endl; break; } if (j == n) //此时a[j]为序列中的最大值,后面都是他赢了 { cout << a[i] << endl; break; } i = j;// 在当前i输的时候,更新下一局,j前面的人已经排到队尾去了,不需要再判断了… } return 0; }