题解:ABC320C - Slot Strategy 2 (Easy)
·题目
链接:Atcoder。
链接:洛谷。
·难度
算法难度:C。
思维难度:C。
调码难度:B。
综合评价:普及-。
·算法
枚举+模拟。
·思路
先遍历最后每个转盘上的数,如果这个数(记作i)分别在a、b、c中出现过就说明最后有可能是这个数。接下来遍历每一秒按照优先级,优先级高的如果还没有停止转动并且现在停止显示数字正好为i,就停止他,否则看下一个(优先级次高的)。优先级直接复制粘贴6个循环。
·代价
O(m),其他的遍历全是常数,只有对于每种情况答案的遍历最坏情况下为3m。
·细节
求答案的循环里判断出口用“三个转盘是否都停止了”来判断。
·代码
#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{},否则会出现一秒停多个转盘的情况。