NC206651. 红绿灯
描述
输入描述
第一行两个空格分隔的正整数,含义如题面所述。
接下来行给出空格分隔的整数与字符串,。
。
。
。
。
输出描述
如果会出现导致矛盾的信息,输出一个正整数代表最早导致矛盾的是第几条信息,否则输出(不含引号)。
示例1
输入:
3 3 0 Green 0 Yellow 1 Green
输出:
2
示例2
输入:
3 3 0 Green 1 Yellow 2 Red
输出:
Correct!
C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 492K, 提交时间: 2020-05-24 14:21:27
//J #include<iostream> #include<cstdio> using namespace std; char s[10]; long long n,t,tim; long long r,g,y; long long r2=1e9,g2=0,y2=1e9; long long flag; int main() { scanf("%lld%lld",&n,&t); r=r2=t-1; g=g2=0; y=y2=-1; for(int i=1;i<=n;i++) { scanf("%lld",&tim); scanf("%s",s); if(s[0]=='R') { tim=tim%t; r2=min(r2,tim); if(y!=-1&&r2<=y&&flag==0) flag=i; if(y==-1&&r2<=g+1&&flag==0) flag=i; } else if(s[0]=='G') { tim=tim%t; g=max(g,tim); if(y2!=-1&&g>=y2&&flag==0) flag=i; if(y2==-1&&g>=r2-1&&flag==0) flag=i; } else if(s[0]=='Y') { tim=tim%t; if(y==-1) y=y2=tim; else y=max(y,tim),y2=min(y2,tim); if(y>=r2&&flag==0) flag=i; if(y2<=g&&flag==0) flag=i; } } if(flag==0) printf("Correct!"); else printf("%lld",flag); }
C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 616K, 提交时间: 2020-06-28 14:04:25
#include<bits/stdc++.h> using namespace std; int main() { int i,x,a=0,bl=0,br=0,c=0,n,T,flag=0; char R[9]; scanf("%d%d",&n,&T); for(i=1;i<=n;i++) { scanf("%d%s",&x,R),x=x%T+1; if(flag)continue; if(R[0]=='G') { if((bl&&x>=bl)||(c&&x>=c-1)||x>T-2)flag=i; if(x>a)a=x; } else if(R[0]=='Y') { if((a&&x<=a)||(c&&x>=c)||x==1||x==T)flag=i; if(!bl||(bl&&x<bl))bl=x; if(x>br)br=x; } else { if((a&&x<=a+1)||(br&&x<=br)||x<3)flag=i; if(!c||(c&&x<c))c=x; } } if(flag)printf("%d\n",flag); else printf("Correct!\n"); }