51nod1402(贪心)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402

题意:中文题诶~

思路:贪心

对于一个桩点,如果我们只考虑其前面的桩点对它的影响的话,可能会出现当前桩点确定后后面的桩点无论取什么值都不满足题意。。。

比如:0××3×0,如果之考虑前面的点的影响的话,当3这个桩点取3后,0位置无论如何都是满足不了的。。。

其实这个问题只要再从后面往前扫一遍就好了。。

综上所述,此题解题步骤为:

1. 从前往后扫一遍,扫描过程为:对于当前点,若没有桩点限制,其值为前一个位置+1,若有桩点限制,则取两者中值较小者。。。

2. 从后往前扫一边。。

3. 每个点的值都为两次扫面结果较小者。。

4. 答案为所有点值中最大值。。

代码:

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 
 5 const int MAXN=1e5+10;
 6 const int inf=1e7;
 7 int l[MAXN], r[MAXN], a[MAXN];
 8 
 9 int main(void){
10     int t;
11     cin >> t;
12     while(t--){
13         memset(l, 0, sizeof(l));
14         memset(r, 0, sizeof(r));
15         memset(a, -1, sizeof(a));
16         int n, m, x, y;
17         cin >> n >> m;
18         while(m--){
19             cin >> x >> y;
20             a[x]=y;
21         }
22         a[1]=0;
23         int cnt1=0, cnt2=inf;
24         for(int i=1; i<=n; i++){
25             cnt1++;
26             if(a[i]>-1) cnt1=min(cnt1, a[i]);
27             l[i]=cnt1;
28         }
29         for(int i=n; i>=1; i--){
30             cnt2++;
31             if(a[i]>-1) cnt2=min(cnt2, a[i]);
32             r[i]=cnt2;
33         }
34         int ans=0;
35         for(int i=1; i<=n; i++){
36             ans=max(ans, min(l[i], r[i]));
37         }
38         cout << ans << endl;
39     }
40     return 0;
41 }
View Code
原文地址:https://www.cnblogs.com/geloutingyu/p/6714222.html