列表

详情


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");
}

上一题