Yandex.Algorithm 2018, final round
思路:如果n这个位置加1的话,不同的数的个数要么不变,要么加1,反之,如果不同的数的个数减少,肯定不是n这个位置加1
我们random_shuffle()50次,每次把不是n的位置标记一下,这样有很大的概率把所有的不是n的位置都标记了
代码:
#pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pi acos(-1.0) #define LL long long //#define mp make_pair #define pb push_back #define ls rt<<1, l, m #define rs rt<<1|1, m+1, r #define ULL unsigned LL #define pll pair<LL, LL> #define pli pair<LL, int> #define pii pair<int, int> #define piii pair<pii, int> #define mem(a, b) memset(a, b, sizeof(a)) #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define fopen freopen("in.txt", "r", stdin);freopen("out.txt", "w", stout); //head const int N = 1e3 + 5; int a[N]; bool vis[N]; int main() { int n, tot = 50; scanf("%d", &n); for (int i = 1; i <= n; i++) a[i] = i; int pre = n, now; while(tot--) { random_shuffle(a+1, a+1+n); for (int i = 1; i <= n; i++) { printf("0 %d\n", a[i]); fflush(stdout); scanf("%d", &now); if(now < pre) { vis[a[i]] = true; } pre = now; } } for (int i = 1; i <= n; i++) if(!vis[i]) return 0*printf("1 %d\n", i); return 0; }