您的位置:首页 > 其它

Codeforces 650B Image Preview(尺取法)

2016-07-16 08:40 260 查看
题目大概说手机有n张照片。通过左滑或者右滑循环切换照片,滑动需要花费a时间;看一张照片要1时间,而看过的可以马上跳过不用花时间,没看过的不能跳过;有些照片要横着看,要花b时间旋转方向。那么问T时间下最多可以看多少张相片。

先确定左滑最多能看到哪张,然后用另一个指针从第一张照片往右移动,这代表先右滑然后左滑的方式看照片,而每次向右的指针移动计算其时间,不合法的话就通过向左的指针向右移修正时间;

而先左滑然后右滑的方式同理。

模拟题,好难写。。不过写好后提交居然就1A了。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[1111111];
bool vis[1111111];
int main(){
int n,a,b,T;
scanf("%d%d%d%d",&n,&a,&b,&T);
scanf("%s",str);

int i=0,j=0,ans=0;
int t=T,cnt=0;
while(j<n){
if(str[j]=='w') t-=b;
--t;
if(t<0) break;
++cnt;
t-=a;
++j;
}
if(cnt==0){
putchar('0');
return 0;
}
ans=max(ans,cnt);
t=T;
for(int k=0; k<cnt; ++k){
if(str[k]=='w') t-=b;
--t;
if(k!=cnt-1) t-=a;
vis[k]=1;
}
j=cnt-1;
while(true){
if(--i==-1) i=n-1;
if(vis[i]) break;
t-=a;
if(str[i]=='w') t-=b;
--t;
t-=a;
while(t<0 && j>0 && vis[j]){
t+=a;
if(str[j]=='w') t+=b;
++t;
--cnt;
vis[j]=0;
--j;
}
if(t<0) break;
++cnt;
ans=max(ans,cnt);
}

memset(vis,0,sizeof(vis));
i=0; j=0;
t=T; cnt=0;
while(cnt<n){
if(str[i]=='w') t-=b;
--t;
if(t<0) break;
++cnt;
t-=a;
if(--i==-1) i=n-1;
}

ans=max(ans,cnt);
t=T;
for(int k=0,tmp=0; k<cnt; ++k){
if(str[tmp]=='w') t-=b;
--t;
if(k!=cnt-1) t-=a;
vis[tmp]=1;
if(--tmp==-1) tmp=n-1;
}
if(++i==n) i=0;
while(true){
if(++j==n) j=0;
if(vis[j]) break;
t-=a;
if(str[j]=='w') t-=b;
--t;
t-=a;
while(t<0 && i && vis[i]){
t+=a;
if(str[i]=='w') t+=b;
++t;
--cnt;
vis[i]=0;
if(++i==n) i=0;
}
if(t<0) break;
++cnt;
ans=max(ans,cnt);
}

printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: