团子大家族(结论题+思维)
题目描述
dango, dango, dango daikazoku
团子, 团子, 团子大家族。
团子(だんご)是 动画《Clannad》中虚构的一种很萌的生物,也是本题的主人公。
团子们在一起做游戏。首先,n个团子们每个团子有一个编号,排成一排。
接下来进行若干轮操作。
奇数轮,每个团子把自己的编号变成自己原先编号和右边相邻的团子原先编号的较大值,同时最右边的团子离开游戏。
偶数轮,每个团子把自己的编号变成自己原先编号和左边相邻的团子原先编号的较小值,同时最左边的团子离开游戏。
每过一轮都会离开一个团子,经过(n-1)轮之后恰好还有一个团子。团子们想知道最后剩下的这个团子身上的编号是多少。
团子, 团子, 团子大家族。
团子(だんご)是 动画《Clannad》中虚构的一种很萌的生物,也是本题的主人公。
团子们在一起做游戏。首先,n个团子们每个团子有一个编号,排成一排。
接下来进行若干轮操作。
奇数轮,每个团子把自己的编号变成自己原先编号和右边相邻的团子原先编号的较大值,同时最右边的团子离开游戏。
偶数轮,每个团子把自己的编号变成自己原先编号和左边相邻的团子原先编号的较小值,同时最左边的团子离开游戏。
每过一轮都会离开一个团子,经过(n-1)轮之后恰好还有一个团子。团子们想知道最后剩下的这个团子身上的编号是多少。
输入
第1行一个整数n, 表示团子的个数
第2行n个整数, 空格隔开, 从左到右表示每个团子的编号a1,a2…ai..an
第2行n个整数, 空格隔开, 从左到右表示每个团子的编号a1,a2…ai..an
输出
一行一个整数表示最后剩下的团子的编号.
样例输入 Copy
7
70611 29202 67893 80203 157086 37318 141366
样例输出 Copy
80203
提示
全部测试点, 10<=n<=200000, 0<=ai<=200000
思路:仔细想想,最中间的那个数一定是左右左的走。写了几组数据,大胆猜测
偶数是中间两个数的最大值。因为偶数最后一项操作数奇数次操作。
奇数一开始猜测数最中间的那个数,这很接近了。但是不是。正确的应该 min(max(a[i],a[i+1),max(a[i+1],a[i+2]))。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
#define rep(i , a , b) for(register ll i=(a);i<=(b);i++)
#define per(i , a , b) for(register ll i=(a);i>=(b);i--)
#define ms(s) memset(s, 0, sizeof(s))
#define squ(x) (x)*(x)
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll , ll> pi;
typedef unordered_map<int,int> un_map;
template<class T>
inline void read (T &x) {
x = 0;
int sign = 1;
char c = getchar ();
while (c < '0' || c > '9') {
if ( c == '-' ) sign = - 1;
c = getchar ();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar ();
}
x = x * sign;
}
const int maxn = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const ll INF = ll(1e18);
const int mod = 1e9+7;
const double PI = acos(-1);
int a[maxn];
int main(int argc, char * argv[])
{
int n;
read(n);
rep(i,1,n) read(a[i]);
int ans;
if(n%2==0) {
ans = max(a[n/2],a[n/2+1]);
printf("%d\n",ans);
return 0;
}
else {
int x= a[n/2],y=a[n/2+1],z=a[n/2+2];
if(y>=x&&y>=z) {
ans=y;
printf("%d\n",ans);
return 0;
}
if(x>y) swap(x,y);
if(x>z) swap(x,z);
if(y>z) swap(y,z);
ans=y;
}
printf("%d\n",ans);
return 0;
}