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 ...
随机推荐
- Centos 7 smb 安装使用
安装: yum install samba 添加smb用户: smbpasswd -a root /etc/samba/smb.conf 追加: [public] path = / valid use ...
- kimbits_USACO
StringsobitsKim Schrijvers Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits ...
- 【常见的SQL Server连接失败错误以及解决方法】
[常见的SQL Server连接失败错误以及解决方法] http://blog.csdn.net/feixianxxx/article/details/5523922 ADO连接SQL Server ...
- 使用 Visual Studio 部署 .NET Core 应用 ——.Net Core 部署到SUSE Linux Enterprise Server 12 SP2 64 位(GNOME 版本3.20.2)
SUSE Linux安装 apache 命令:sudo zypper in apache 设置apache 服务可用 命令:sudo systemctl enable apache2.service启 ...
- hibernate连接Oracle rac
连接方式与普通的数据库不一样.connection.url 中使用了LOAD-BALANCE = yes 要不然会报错 <hibernate-configuration> <sess ...
- leetcode 之Single Number(14)
这题并不难,但需要注意细节. ListNode* addTwo(ListNode *l1, ListNode *l2) { ListNode dummy(-); ; ListNode *prev = ...
- php上传文件限制
客户端限制(客户端限制在实际上是无法阻止上传): 通过表单隐藏域限制上传文件的最大值 <input type=’hidden’ name=’MAX_FILE_SIZE’ value=’字节数’ ...
- mysql:视图、触发器、事务、存储、函数、流程控制
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 回到顶部 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只 ...
- 一个有趣的基于Django的调试插件--django-debug-toolbar
django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息. git ...
- Python3判断自身脚本是不是在运行
采用Socket方式,启动时占用一个端口,转化问题为判断端口是不是存在? import sys import locale import http.server import socketserver ...