题目链接: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 }
时间: 2024-11-06 13:57:10