考察:贪心+思维

原来是贪心...还以为是dp

思路:

      m个已知信息将n个元素序列分成了n+1段.对于每段端点求峰值即可.

      但是注意第一天的起点是任意高的.

 1 #include <iostream> 
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N = 3;
 6 int n,m,day[N],h[N],ans;
 7 int main()
 8 {
 9     scanf("%d%d",&n,&m);
10     bool ok = 1;
11     for(int i=1;i<=m;i++)
12     {
13         scanf("%d%d",&day[i&1],&h[i&1]);
14         if(i==1)
15         {
16             ans = max(day[i&1]-1+h[i&1],ans);
17             continue;
18         }
19         if(!ok) continue;
20         int late = day[i&1],pre = day[i-1&1];
21         if(h[i-1&1]<h[i&1])
22         {
23             if(day[i-1&1]+h[i&1]-h[i-1&1]>day[i&1]) ok = 0;
24             pre = day[i-1&1]+h[i&1]-h[i-1&1];
25         }else if(h[i-1&1]>h[i&1]) 
26         {
27             int dd =h[i-1&1]-h[i&1];
28             if(day[i&1]-dd<day[i-1&1]) ok = 0;
29             late = day[i&1]-dd;
30         }
31         int d = late - pre>>1;
32         ans = max(max(h[i&1],h[i-1&1])+d,ans);
33     }
34     int dt = n-day[m&1];
35     ans = max(ans,h[m&1]+dt);
36     if(ok) printf("%d\n",ans);
37     else puts("IMPOSSIBLE");
38     return 0;
39 }