题目大意
给定一个循环播放的红绿灯标识字段s
,红绿灯一秒变一个颜色,只有三种颜色,红绿黄,现在给出你所在时刻的红绿灯的颜色c,但是你并不知道你所处的具体时间点,求从任意一个颜色是c的点出发后最多经过t
秒一定能遇到一个绿灯,求最小的t
题目链接
Problem - 1744C - Codeforces
又是一道我一直卡住的题,不是因为别的,只是不会活学会用罢了,记录这个题就是为了长个教训,尤其是时间超限的情况,一定要想一些更高效的办法。
例如下文中即将用到的lower_bound:
#include<bits/stdc++.h>using namespace std;char s[600000];int main(){int t,k;scanf("%d",&t);while(t--){int n;char c;cin>>n;cin>>c;for(int i=0;i<n;i++){cin>>s[i];s[i+n]=s[i];//重复一遍,方便找到c灯之后的第一个绿灯}if(c=='g'){cout<<0<<endl;}else{vector<int>vec;//用来存绿灯的各位置 for(int i=0;i<2*n;i++){if(s[i]=='g')vec.push_back(i);}int ans=0;for(int i=0;i<n;i++) {if(s[i]==c)//遍历找到c灯位置 {k=lower_bound(vec.begin(),vec.end(),i)-vec.begin();//找到vec中大于等于i的第一个值的位置//也就是c灯后第一个绿灯的位置 ans=max(ans,vec[k]-i);}}cout<<ans<<endl;}} }