NC21730. Rabbit的机器人
描述
输入描述
第一行一个整数N,表示指令长度。
接下来一行一个长度为N的字符串,代表Rabbit设置的指令。
输出描述
如果有解,输出两个整数表示Rabbit最少放置障碍的个数以及在放置个数最小的情况下的方案数,用空格隔开。
否则输出“-1”。
示例1
输入:
3 LLR
输出:
1 1
说明:
可以在-1这个位置放置障碍物,只执行向右走的操作。C++11(clang++ 3.9) 解法, 执行用时: 60ms, 内存消耗: 2552K, 提交时间: 2019-01-08 20:58:57
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1000005; const ll INF = 1e18; const ll mod=1e9+7; const double eps = 1e-7; char s[maxn]; char tmp; int len; int check(int x) { int pos=0; int Max=0; for(int i=0; i<len; i++) { Max=max(Max,pos); if(s[i]==tmp) pos++; else pos--; if(pos==-x) pos++; } return pos>Max; } int main() { int len1; scanf("%d",&len1); scanf("%s",s); len=strlen(s); tmp=s[len-1]; int l=1,r=len; int ans=-1; while(l<=r) { int mid=(l+r)/2; if(check(mid)) { ans=mid; l=mid+1; } else r=mid-1; } if(ans==-1) puts("-1"); else if(ans==len) puts("0 1"); else printf("1 %d\n",ans); }
C++14(g++5.4) 解法, 执行用时: 36ms, 内存消耗: 1368K, 提交时间: 2020-08-06 12:05:01
#include<bits/stdc++.h> using namespace std; int n,l,r,mid,ans=-1; char R[1000005]; bool judge(int x) { int i,j=0,k=0; for(i=0;i<n;i++) { k=max(k,j); if(R[i]==R[n-1])j++; else j--; if(j==-x)j++; } return j>k; } int main() { scanf("%d%s",&n,R); for(l=1,r=n;l<=r;) { mid=(l+r)>>1; if(judge(mid))ans=mid,l=mid+1; else r=mid-1; } if(ans==-1)printf("-1\n"); else if(ans==n)printf("0 1\n"); else printf("1 %d\n",ans); return 0; }