题目链接:http://codeforces.com/problemset/problem/650/B
题意:
一只手机上有n张照片,从第1张看起,记住这些照片(1秒钟)。
照片有的要水平看,有的要垂直看。
手机是垂直的,不能动。当前位置只能滑动要他的左边或右边,花费的时间是a。
目前在ID 1 ,向左滑动到ID n, 不能不看,如果看过,则不记看的时间,但要记滑动的时间。如果不是正确的方向,要花费b的时间调整。
注意可以折回来看。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int N = 1e6 + 10; 8 char ch[N]; 9 int l[N], r[N]; 10 int main() 11 { 12 int n, a, b, k, res = 0, i, j; 13 scanf("%d%d%d%d%s", &n, &a, &b, &k, ch + 1); 14 l[1] = (ch[1] == 'w') * b + 1; 15 for(i = 2; i <= n; i++)//一直向右滑动 16 l[i] = l[i - 1] + (ch[i] == 'w') * b + a + 1; 17 for(j = n; j >= 1; j--)//一直向左滑动 18 r[j] = r[j + 1] + (ch[j] == 'w') * b + a + 1; 19 j = n + 1; 20 for(i = n; i >= 1; i--)//一直向左看了i张照片 21 { 22 for(; j - 1 > i && l[i] + r[j - 1] + min(n - j + 2, i - 1) * a <= k; j--)// 23 ; 24 if(l[i] + r[j] + min(n - j + 1, i - 1) * a <= k)//起点向左看了n - j + 1张照片。i减少时,起点向右看的照片就少了; j这时候也在减少,但起点向右看的照片在增多啊。 25 res = max(i + n - j + 1, res);//技巧就在 j ,自己领会 26 } 27 printf("%d ", res); 28 return 0; 29 }