看完题目,我的脑海里就蹦出了两个字“模拟”。
因为这个是割“圆”,而不是割“线”,所以,模拟的数组要加一个特判,即为首位-1=末位,末位+1=首位
如果你是在晚上做的这道题,忽略了这是一个“圆”的话,你今天别想睡觉了,因为你十有八九要花几个小时找出这个有一点“幼稚”的问题。
思路:输入m次编号s,总共分为2种情况:1、这个编号是这个输入序列(圆)的第一个数吗?如果是,计数+1,保存数据2、第s个灯没亮,但左右亮了吗?如果是,计数+1,保存数据。这里一定一定要注意,这个一定要是第一个数才行。
切记:
for(){
if(yes){
打yes;
}else{
打no;
}
}
这种写法是一定错误的,这和素数判断的道理差不多。
上代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,s,l,r,a[1005]={0},cnt=0,fi,se;
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>s;
l=s-1;
r=s+1;
if(l==0){
l=n;
}
if(r>n){
r=1;
}
if(cnt==0){
a[s]=1;
cnt++;
fi=se=s;
}else{
if((a[l]==1||a[r]==1)&&a[s]==0){//第s个灯没亮,但左右亮了
a[s]=1;
cnt++;
se=s;
}
}
if(cnt==n){
cout<<fi<<' '<<se;
break;
}
}//m次
if(cnt!=n){
cout<<"No";
}
return 0;
}