赞
踩
链接: C. Searching Local Minimum
题意: 给你一个大小为 n 排列 , 一次询问可以得到位置 i 的数,要求在不超过 100 次询问的条件下找到该排列的一个波谷,即找到位置 k满足:a[k] < a[k - 1] && a[k] < a[k + 1]。
思路:
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=4e6 + 7; const int mod = 1e9 + 7; int T; int n,a[maxn],vis[maxn]; void query(int x){ if(vis[x]) return ; printf ("? %d\n",x); fflush(stdout); scanf("%d",&a[x]); vis[x] = 1; } int main (){ int l,r,mid; a[0] = a[n + 1] = n + 1; scanf("%d",&n); if(n == 1){ printf ("! 1\n"); return 0; } query(1); query(n); int flag = 1; if(a[1] > a[n]) flag = 0; l = 1,r = n; while(l <= r){ if(flag){ query(l + 1); if(a[l] < a[l + 1]){ printf ("! %d\n",l); return 0; } mid = (l + r) / 2; query(mid); if(a[mid] > a[l]){ r = mid; l += 1; } else{ query(mid - 1); if(a[mid - 1] > a[mid]){ l = mid; } else { r = mid - 1; flag = 1 - flag; } } } else{ query(r - 1); if(a[r] < a[r - 1]){ printf ("! %d\n",r); return 0; } mid = (l + r) / 2; query(mid); if(a[mid] > a[r]){ l = mid; r -= 1; } else{ query(mid + 1); if(a[mid + 1] > a[mid]){ r = mid; } else { l = mid + 1; flag = 1 - flag; } } } } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。