codeforces round 345 div2 Image Interview 贪心 + 二分

来源:互联网 发布:mac手机铃声 编辑:程序博客网 时间:2024/05/29 03:52
/*    题目描述:给出一排照片,每次可以向前或向后翻一张,翻一张的时间是a,如果照片初始的方向是水平的,那么需要b的时间将照片            转向,看一张照片需要1的时间。现在手机上打开的是第一张照片,现在你有T的时间,要求在不跳过某些照片不看的前提            下,最多能看多少张照片?                            思路:因为不能跳过某些照片,所以最终看的照片是连续的,而连续的话最好的策略共有四种情况:                1、从第一张开始,先向后看几张,然后返回第一张,再转到第n张向前看                2、从第一张开始,先转到第n张,向前看几张,再转回第1张,向后看几张                3、从第一张开始,转到第n张,然后一直向前看                4、从第一张开始,一直向后看                分别计算这四种情况下的最大值,其中前两种情况计算最大值时需要二分*/#pragma warning(disable:4786)#pragma comment(linker, "/STACK:102400000,102400000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<stack>#include<queue>#include<map>#include<set>#include<vector>#include<cmath>#include<string>#include<sstream>#define LL long long#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)#define mem(a,x) memset(a,x,sizeof(a))#define lson l,m,x<<1#define rson m+1,r,x<<1|1using namespace std;const int INF = 0x3f3f3f3f;const int mod = 1e9 + 7;const double PI = acos(-1.0);const double eps=1e-6;const int maxn = 5e5 + 5;char s[maxn];int pre[maxn], suf[maxn];int bsearch1(int left , int right , int rt){    int mid , ret =-1;    while(left <= right){        mid = left + (right - left)/ 2;        if(suf[mid] <= rt){            ret = mid;            right = mid - 1;        }        else{            left = mid + 1;        }    }    return ret;}int bsearch2(int left , int right , int rt){    int ret = -1 , mid ;    while(left <= right){        mid = left + (right - left)/2;        if(pre[mid] - pre[1] <= rt){            ret = mid ;            left = mid + 1 ;        }        else{            right = mid - 1;        }    }    return ret;}int main(){    int n, a, b, T;    scanf("%d%d%d%d", &n , &a , &b , &T);    scanf("%s" , s + 1);    int len = strlen(s + 1);    pre[1] = (s[1] == 'h' ? 1 : b + 1);    for(int i = 2 ; i<= len ; i++){        pre[i] = pre[i - 1] + a + 1 + (s[i] == 'w' ? b : 0 );    }    for(int i = len ; i>= 1 ; i--){        suf[i] = suf[i + 1] + a + 1 + (s[i] == 'w' ? b : 0);    }    if(pre[n] <= T){        printf("%d\n",n);        return 0;    }    int ans = 0 ;    for(int i = 1 ; i<= n ; i++){               //先向后再向前        int rt = T - pre[i] - (i - 1) * a;        if(rt < 0)  continue;        int rcnt = bsearch1(i + 1 , n , rt);        if(rcnt != -1)            ans = max(ans , i + n - rcnt +1);        else            ans = max(ans , i );    }    for(int i = n ; i>= 1; i--){                //先向前再向后        int rt = T - suf[i] - (n - i + 1) * a - pre[1];        if(rt < 0)  continue;        int lcnt = bsearch2(2 , n , rt);        if(lcnt != -1)            ans = max(ans , n - i + 1 + lcnt);        else            ans = max(ans , n - i + 2);    }    for(int i = 1 ; i<= n ; i++){       //一直向前走        if(pre[i] <= T)            ans = max(ans , i);    }    for(int i = n ; i>= 2; i--){        //一直向后走        if(pre[1] + suf[i] <= T)            ans = max(ans, n - i + 2);    }    printf("%d\n",ans);    return 0;}

0 0
原创粉丝点击