codeforce650B_技巧

题目链接: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\n", res);
28     return 0;
29 }

 

posted @ 2016-05-30 16:03  海无泪  阅读(453)  评论(0编辑  收藏  举报