Codeforces Round #345 (Div. 2) D. Image Preview 暴力 二分
D. Image Preview
题目连接:
http://www.codeforces.com/contest/651/problem/D
Description
Vasya's telephone contains n photos. Photo number 1 is currently opened on the phone. It is allowed to move left and right to the adjacent photo by swiping finger over the screen. If you swipe left from the first photo, you reach photo n. Similarly, by swiping right from the last photo you reach photo 1. It takes a seconds to swipe from photo to adjacent.
For each photo it is known which orientation is intended for it — horizontal or vertical. Phone is in the vertical orientation and can't be rotated. It takes b second to change orientation of the photo.
Vasya has T seconds to watch photos. He want to watch as many photos as possible. If Vasya opens the photo for the first time, he spends 1 second to notice all details in it. If photo is in the wrong orientation, he spends b seconds on rotating it before watching it. If Vasya has already opened the photo, he just skips it (so he doesn't spend any time for watching it or for changing its orientation). It is not allowed to skip unseen photos.
Help Vasya find the maximum number of photos he is able to watch during T seconds.
Input
The first line of the input contains 4 integers n, a, b, T (1 ≤ n ≤ 5·105, 1 ≤ a, b ≤ 1000, 1 ≤ T ≤ 109) — the number of photos, time to move from a photo to adjacent, time to change orientation of a photo and time Vasya can spend for watching photo.
Second line of the input contains a string of length n containing symbols 'w' and 'h'.
If the i-th position of a string contains 'w', then the photo i should be seen in the horizontal orientation.
If the i-th position of a string contains 'h', then the photo i should be seen in vertical orientation.
Output
Output the only integer, the maximum number of photos Vasya is able to watch during those T seconds.
Sample Input
4 2 3 10
wwhw
Sample Output
2
Hint
题意
有n张照片,你看一张照片需要1秒,你滑动照片到左边或者右边,需要a秒,翻转照片需要b秒,问你在T秒内最多看多少张照片
照片必须看,不能跳过。
手机是h的,一直保持着h不变。
题解:
暴力枚举左边看多少张,然后二分右边最多看多少张
暴力枚举右边看多少张,然后二分左边。
具体实现,就当成模拟题去做吧……
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+7;
int n,a,b,T;
string s;
int d[maxn],d2[maxn];
int check(char k)
{
if(k=='w')return 0;
else return 1;
}
int update(int x,int y)
{
if(x+y>1e9)return 1e9+1;
return x+y;
}
int main()
{
scanf("%d%d%d%d",&n,&a,&b,&T);
T+=a;
cin>>s;
int now = 1;
for(int i=0;i<n;i++)
{
if(i!=0)d[i]=d[i-1];
if(check(s[i])!=now)
d[i]=update(d[i],a+b+1);
else
d[i]=update(d[i],a+1);
}
now = 1;
reverse(s.begin(),s.end());
for(int i=0;i<n;i++)
{
if(i!=0)d2[i]=d2[i-1];
if(check(s[i])!=now)
d2[i]=update(d2[i],a+b+1);
else
d2[i]=update(d2[i],a+1);
}
reverse(s.begin(),s.end());
int ans = 0;
for(int i=0;i<n;i++)
{
if(T<d[i])break;
int las = T - d[i];
ans=max(i+1,ans);
if(i==n-1)continue;
if(las<a*i+d2[0])continue;
las-=a*i;
int l=0,r=n-i-2,Ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(d2[mid]<=las)l=mid+1,Ans=mid;
else r=mid-1;
}
ans=max(i+1+Ans+1,ans);
}
if(s[n-1]!=s[0])T-=b;
for(int i=0;i<n-1;i++)
{
if(T<d2[i]+d[0]+a)break;
int las = T - d2[i] - d[0] - a;
ans=max(i+2,ans);
if(las<a*i)continue;
las-=a*i;
las+=d[0];
int l=0,r=n-i-2,Ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(d[mid]<=las)l=mid+1,Ans=mid;
else r=mid-1;
}
ans=max(i+1+Ans+1,ans);
}
cout<<ans<<endl;
}
Codeforces Round #345 (Div. 2) D. Image Preview 暴力 二分的更多相关文章
- Codeforces Round #345 (Div. 1) B. Image Preview
Vasya's telephone contains n photos. Photo number 1 is currently opened on the phone. It is allowed ...
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings 暴力
B. Beautiful Paintings 题目连接: http://www.codeforces.com/contest/651/problem/B Description There are n ...
- Codeforces Round #367 (Div. 2) A B C 暴力 二分 dp(字符串的反转)
A. Beru-taxi time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #365 (Div. 2) C - Chris and Road 二分找切点
// Codeforces Round #365 (Div. 2) // C - Chris and Road 二分找切点 // 题意:给你一个凸边行,凸边行有个初始的速度往左走,人有最大速度,可以停 ...
- Codeforces Round #354 (Div. 2) C. Vasya and String 二分
C. Vasya and String 题目连接: http://www.codeforces.com/contest/676/problem/C Description High school st ...
- Codeforces Round #345 (Div. 2)
DFS A - Joysticks 嫌麻烦直接DFS暴搜吧,有坑点是当前电量<=1就不能再掉电,直接结束. #include <bits/stdc++.h> typedef long ...
- Codeforces Round #345 (Div. 2)【A.模拟,B,暴力,C,STL,容斥原理】
A. Joysticks time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...
- Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集
题目链接: http://codeforces.com/problemset/problem/650/C C. Table Compression time limit per test4 secon ...
随机推荐
- js 实时显示字数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 函数导出在kvm_intel.ko,kvm.ko不共享
KVM一共包含了三个内核模块,kvm_intel.ko,kvm_amd.ko,kvm.ko.其中两个重要文件x86.c和vmx.c在编译后分别会生成kvm_intel.ko和kvm.ko两个内核模块, ...
- 25个Linux相关的网站【转】
转自:http://www.cnblogs.com/Lindaman/p/4552805.html 下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件, ...
- C#比较两个list集合,两集合同时存在或A集合存在B集合中无
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Kotlin 学习使用之旅(二)
为什么从二开始呢?再此之前已经有了一篇了,那是刚知道kotlin的时候草(chao)来(chao)的并且学习一篇, 这次是自己在项目中正式使用并且遇到的一些问题记录,供kotlin新入门的童鞋参考,避 ...
- Python的语言特性
1.Python的函数传参 Python中所有的变量都可以理解为内存中一个对象的“引用”,或者,也可以看似C中的void *的感觉.这里记住的是类型是属于对象的,而不是变量.对象分为两种: 可更改的: ...
- [How to] UILocalNotification 的使用
1.简介 IOS共分为本地和远程通知两种通知,本问介绍本地通知UILocalNotification的基本使用方法. 2.本地通知的实现: 步骤一:新建工程 在Xcode中新建一个single vie ...
- maven使用备忘
maven的所有功能本质上都是通过插件来实现的所有的功能.archetype插件就是根据项目类型创建项目的插件.执行archetype:generate命令就会list一系列的项目类型,可以选择一个合 ...
- 关于 拼接 url 连接 参数的问题(爬虫)。
比如这里 我找的 后台请求的json的链接: 第一页: http://www.igoldenbeta.com:8080/cn-jsfund-server-mobile/bkt/api?appkey=1 ...
- jdbc预编译插入数据操作
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...