51nod——1402最大值、2479小b分糖果 (套路)
1402最大值:正向从1到n,如果没有限制,就依次递增1,如果有限制,就取那个限制和递增到这的最小值。这样保证1和每个限制点后面都是符合题意的递增,但是限制点前面这个位置可能会有落差(之前递增多了)。不过我们再反向来一遍,再使每一个限制点前面都是符合题意的递增,每个位置取反向这个过程和正向扫过的最小值。再对全局取max。
2479小b分糖果:正向从1到n,如果相邻且评分更高,就递增1,反向从n到1如果相邻且评分更高,就取后面位置递增1和正向扫过的最大值(前面的糖果已经是最少的了,不能减了)。再对全局求和。
1042:
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:
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 }
Stay Hungry, Stay Foolish