51nod——1402最大值、2479小b分糖果 (套路)

  1402最大值:正向從1到n,若是沒有限制,就依次遞增1,若是有限制,就取那個限制和遞增到這的最小值。這樣保證1和每一個限制點後面都是符合題意的遞增,可是限制點前面這個位置可能會有落差(以前遞增多了)。不過咱們再反向來一遍,再使每個限制點前面都是符合題意的遞增,每一個位置取反向這個過程和正向掃過的最小值。再對全局取max。ios

  2479小b分糖果:正向從1到n,若是相鄰且評分更高,就遞增1,反向從n到1若是相鄰且評分更高,就取後面位置遞增1和正向掃過的最大值(前面的糖果已是最少的了,不能減了)。再對全局求和。c++

 

1042:spa

 1 #include <bits/stdc++.h>
 2 using namespace std;  3 #define maxn 100050
 4 int s[maxn], ans1[maxn],ans2[maxn];  5 int main() {  6     std::ios::sync_with_stdio (0);  7     cin.tie (0);  8     int t; cin >> t;  9     while (t--) { 10         int n, m; cin >> n >> m; 11         memset (s, -1, sizeof (s)); 12         memset (ans1, 0, sizeof (ans1)); 13         memset (ans2, 0, sizeof (ans2)); 14         for (int i = 0; i < m; i++) { 15             int id, x; cin >>id>>x ; s[id]=x; 16  } 17         for (int i = 2; i <= n; i++) { 18             ans1[i]=ans1[i-1]+1; 19             if(s[i]!=-1) ans1[i]=min(ans1[i],s[i]); 20  } 21         ans2[n]=ans1[n]; 22         for(int i = n - 1; i > 0; i--){ 23             ans2[i]=ans2[i+1]+1; 24             if(s[i]!=-1) ans2[i]=min(ans2[i],s[i]); 25  } 26         int maxx=0; 27         for(int i=1;i<=n;i++) 28             maxx=max(maxx,min(ans1[i],ans2[i])); 29 
30         cout<<maxx<<endl; 31  } 32 
33     return 0; 34 }

 

2479:code

 1 ///這題遇見兩次了
 2 #include <bits/stdc++.h>
 3 using namespace std;  4 #define maxn 50050
 5 int num[maxn],a[maxn];  6 int main(){  7     std::ios::sync_with_stdio(0);  8     cin.tie(0);  9     int n; cin>>n; 10     long long ans=0; 11     for(int i=0;i<n;i++) cin>>a[i]; 12     fill(num,num+n,1); 13     for(int i=1;i<n;i++) 14         if(a[i]>a[i-1]) num[i]=num[i-1]+1; 15 
16     for(int i=n-2;i>=0;i--) 17         if(a[i]>a[i+1]) num[i]=max(num[i],num[i+1]+1); 18 
19     for(int i=0;i<n;i++) ans+=num[i]; 20     cout<<ans<<endl; 21     return 0; 22 }
相關文章
相關標籤/搜索