题解:ABC 320C - Slot Strategy 2 (Easy)
·题目
链接:Atcoder。
链接:洛谷。
·难度
算法难度:C。
思维难度:C。
调码难度:B。
综合评价:普及-。
·算法
枚举+模拟。
·思路
先遍历最后每个转盘上的数,如果这个数(记作i)分别在a、b、c中出现过就说明最后有可能是这个数。接下来遍历每一秒按照优先级,优先级高的如果还没有停止转动并且现在停止显示数字正好为i,就停止他,否则看下一个(优先级次高的)。优先级直接复制粘贴6个循环。
·代价
O(m),其他的遍历全是常数,只有对于每种情况答案的遍历最坏情况下为3m。
·细节
求答案的循环里判断出口用"三个转盘是否都停止了"来判断。
·代码
cpp
#include<bits/stdc++.h>
using namespace std;
string a="",b="",c="";
int m=0;
bool x[10]={},y[10]={},z[10]={};
int main(){
scanf("%d",&m);
cin>>a>>b>>c;
for(int i=0;i<m;i++){
x[a[i]-'0']=true;
y[b[i]-'0']=true;
z[c[i]-'0']=true;
}
//输入,并记录每个数在相应转盘上是否出现
int tans=1<<30;
for(int i=0;i<10;i++){
if(x[i]==true&&y[i]==true&&z[i]==true){
//都出现过,有可能作为最后答案
int ans=0;
bool f=false,g=false,h=false;
//ans:本次所用时间;f、g、h:分别记录每个转盘是否已经停止
ans=0;
f=false,g=false,h=false;
for(int j=0;f==false||g==false||h==false;j++){
//遍历每一秒
if(a[j%m]==i+'0'&&f==false){
f=true;
//最高优先级先判断
}
else if(b[j%m]==i+'0'&&g==false){
g=true;
//次高
}
else if(c[j%m]==i+'0'&&h==false){
h=true;
//最低
}
ans=j;
//更新答案
}
tans=min(tans,ans);
//答案取最优值,后同理
ans=0;
f=false,g=false,h=false;
for(int j=0;f==false||g==false||h==false;j++){
if(a[j%m]==i+'0'&&f==false){
f=true;
}
else if(c[j%m]==i+'0'&&h==false){
h=true;
}
else if(b[j%m]==i+'0'&&g==false){
g=true;
}
ans=j;
}
tans=min(tans,ans);
ans=0;
f=false,g=false,h=false;
for(int j=0;f==false||g==false||h==false;j++){
if(c[j%m]==i+'0'&&h==false){
h=true;
}
else if(a[j%m]==i+'0'&&f==false){
f=true;
}
else if(b[j%m]==i+'0'&&g==false){
g=true;
}
ans=j;
}
tans=min(tans,ans);
ans=0;
f=false,g=false,h=false;
for(int j=0;f==false||g==false||h==false;j++){
if(c[j%m]==i+'0'&&h==false){
h=true;
}
else if(b[j%m]==i+'0'&&g==false){
g=true;
}
else if(a[j%m]==i+'0'&&f==false){
f=true;
}
ans=j;
}
tans=min(tans,ans);
ans=0;
f=false,g=false,h=false;
for(int j=0;f==false||g==false||h==false;j++){
if(b[j%m]==i+'0'&&g==false){
g=true;
}
else if(a[j%m]==i+'0'&&f==false){
f=true;
}
else if(c[j%m]==i+'0'&&h==false){
h=true;
}
ans=j;
}
tans=min(tans,ans);
ans=0;
f=false,g=false,h=false;
for(int j=0;f==false||g==false||h==false;j++){
if(b[j%m]==i+'0'&&g==false){
g=true;
}
else if(c[j%m]==i+'0'&&h==false){
h=true;
}
else if(a[j%m]==i+'0'&&f==false){
f=true;
}
ans=j;
}
tans=min(tans,ans);
}
}
if(tans==1<<30){
tans=-1;
}
//特判没有答案的情况
printf("%d\n",tans);
return 0;
}
·注意
循环内部要用if{}else if{}else{},否则会出现一秒停多个转盘的情况。