题目链接:http://codeforces.com/problemset/problem/472/C
题目意思:给出 n 个 people(从第1行往下数,编号依次为1,2,...,n),每 个 people 由 first name 和 last name 组成,每个people用他自己的first name 或者是 last name 是不确定的。现在给出p1, p2, ..., pn 这个排列,问按照这个顺序排列能否满足字典序逐渐增加。
思路不难得出。对于第 pi+1 这个人,只要选择比前一个人,即 pi的字典序大的name即可,由于要保证后面的pj (i < j)尽可能满足条件,我们只需要选择较小的那个name,但也要比前一个人的name要大。这个操作可以先 min(f[p], s[p]),如果比前一个人的name要小,我们才选择max(f[p], s[p])
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 using namespace std; 6 7 const int maxn = 1e5 + 5; 8 9 string f[maxn], s[maxn]; 10 string select[maxn]; 11 12 int main() 13 { 14 #ifndef ONLINE_JUDGE 15 freopen("in.txt", "r", stdin); 16 #endif 17 18 int n, p; 19 while (scanf("%d", &n) != EOF) 20 { 21 for (int i = 1; i <= n; i++) 22 cin >> f[i] >> s[i]; 23 scanf("%d", &p); 24 25 select[1] = min(f[p], s[p]); 26 bool flag = true; 27 for (int i = 2; i <= n; i++) 28 { 29 scanf("%d", &p); 30 select[i] = min(f[p], s[p]); 31 if (select[i] < select[i-1] && flag) 32 select[i] = max(f[p], s[p]); 33 if (select[i] < select[i-1] && flag) 34 flag = false; 35 } 36 printf("%s ", flag ? "YES" : "NO"); 37 } 38 return 0; 39 }