#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}
template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}
const int N=5000+10,M=0,Z=1e9+7,ms63=1061109567;
int n,T;
pair<int,int>a[N];
int dfs(int p)
{
if(a[p].first<=T)return a[n].second;
if(a[p].second<=T){T=a[p].second;return dfs(p-1);}
return a[n].first;
}
bool check()
{
for(int i=n;i;--i)
{
if(a[i-1].first<=a[i].second)return 1;
if(a[i-1].second>a[i].second)return 0;
}
//return 1;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;++i)scanf("%d%d",&a[i].first,&a[i].second);
sort(a+1,a+n+1);
//T=a[n].second;printf("%d\n",dfs(n-1));
printf("%d\n",check()?a[n].second:a[n].first);
}
return 0;
}
/*
【trick&&吐槽】
这道题非常有趣,2333
【题意】
给你n(1<=n<=5000)个pair,
对于一个pair(a[i],b[i]),一定有a[i]>b[i],它表示——
我们可以在位置a[i]处,写下一个数,数值可以选择为a[i]或b[i]。
我们希望在所有位置写下的数,按照位置保证升序。
问你,我们究竟要怎么选数,可以使得最后一个数尽可能小。
【类型】
脑洞题
【分析】
这题首先一定是有解的,即我们至少有一种方案,使得数值按照位置保证升序关系。
因为我们可以直接在位置a[i]处写下数值a[i]。
这题想要使得最后一个位置的数尽可能小。
于是,对于最后一个位置a[n],我们这个位置的数可以写b[n]。
然而,写b[n]并不一定是合法的。我们需要使得,在它前面位置的数,数值都比b[n]小。
如果a[n-1]<=b[n],a[n-1]处的数值可以为a[n-1],已经不再影响前效性。答案显然是b[n]
否则a[n-1]处就不能取a[n-1],如果b[n-1]>b[n],那么显然非法;
如果b[n-1]<=b[n],还是有可能合法的,合法性通过前溯n-2与n-1的关系求得。
整体的实现,我们可以通过一个dfs实现。
当然这个可以也用for循环实现2333
【时间复杂度&&优化】
O(n)
*/
【Codeforces Round 274 (Div 2)C】【贪心】Exams a[i]位置写a[i]或b[i] 所有位置的数保证不下降的最早结束时间
最新推荐文章于 2024-07-24 13:02:49 发布