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
- codeforces round 345 div2 Image Interview 贪心 + 二分
- codeforces round #347 div2 B rebus 贪心 + 二分
- codeforces round #364 div2 D As Fast As Possible 二分+贪心
- Codeforces Round #274(Div2) B. Towers 贪心
- Codeforces Round #274(Div2) C. Exams 贪心
- Codeforces Round #345 (Div. 2) D. Image Preview【二分】
- Codeforces Round #345 (Div. 2)D Image Preview(二分)
- CF Round#424(div2)D题 二分+贪心
- Codeforces Round #273(Div2) B. Random Teams 贪心+数学
- Codeforces Round 444 div2 D two pointer + 贪心
- Codeforces Round #211 (Div. 2)(二分贪心)
- Exams Codeforces Round#377-D(贪心+二分)
- Codeforces #227(Div2) E. George and Cards 贪心+二分
- codeforces #262 DIV2 C题Present(二分+贪心)
- codeforces round 177 div2 二分问题+思维问题
- Codeforces Round #275(Div2) B.Friends and Presents 二分+数学
- codforces Codeforces Round #409 div2 C 二分搜索
- codeforces round #174 div2
- IPC之Messenger
- NULL, '\0',0 '0'的区别
- fiddler4 测试Web接口
- 前端编程中,如何消除浏览器缓存
- Unity3D Shader 新手教程(1/6)
- codeforces round 345 div2 Image Interview 贪心 + 二分
- 请不要做一个浮躁的嵌入式工程师
- C# 第14章 上机3,4,5
- Fizz Buzz 问题
- 海洋模拟
- Mysql多实例安装+主从复制+读写分离 -学习笔记
- mysql解压缩启动问题
- golang fork 系统资源共享可行性验证
- 对测试人员或开发人员来说相互沟通有多重要?