列表

详情


NC230375. Awa不会打音游

描述

Awa正在尝试跟上新人类进化的步伐!

关于“音游”:
题目中的音游特指4k(即含有四条轨道)以及5k(即含有五条轨道)的下落式音游,同时游戏中的按键类型只有“长条”这一种

Awa是一名4k音游玩家,也就是说,他只使用左右两手的食指和中指进行游戏。现在他开始尝试5k音游,但他同样只使用这四根手指游玩,同时,各手指之间不能互相跨越(也就是说一直要保持从左到右依次是左手中指、左手食指、右手食指、右手中指)

现在给出一份铺面描述,形式如下:
第一行一个正整数n,表示一共出现n个长条
之后n行,每行三个正整数a,b,c,分别表示这个长条在a时刻出现,b时刻消失,它所在的轨道是c
在长条出现时,Awa必须分配一根手指去按住它,直到长条消失为止(注意手指不能乱用哦),如果无法分配,则游戏中止
数据保证长条不会重叠

虽然Awa只会用四根手指,但是他的手速很快,可以不花时间的将一根手指按到某个轨道上,或者从一个轨道移到另一个轨道上,松手和按下去同样不需要时间。
现在Awa希望你告诉他这张铺面是否可以被完成?

输入描述

第一行一个整数,表示长条的个数;
之后n行,每行三个正整数,分别表示这个长条在a时刻出现,b时刻消失,它所在的轨道是c

输出描述

如果铺面可以被完成,输出"Yes",否则输出"No"

示例1

输入:

4
1 5 1
1 5 2
1 5 3
1 5 4

输出:

Yes

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 319ms, 内存消耗: 9892K, 提交时间: 2021-11-23 21:36:28

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6+10;
struct node{
	int s,t,c;
}no[N];
bool cmp(node a,node b){
	return a.s<b.s;
}
int pos[2][16][5]; //µÚi´Î½áÊøºó¶ÔӦ״̬µÄ¶ÔÓ¦ÊÖÖ¸µÄλÖà 
int kuai[2][16][5]; //ÊÖÖ¸°´µÄÊǵڼ¸¸ö¿é 
int val[5]={0,1,2,4,8}; //ÿ¸öλÖõÄȨֵ 
int dp[2][16];
bool used[5];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d %d %d",&no[i].s,&no[i].t,&no[i].c);
	}
	sort(no+1,no+1+n,cmp);
	int up = 1<<4; //״̬´Ó0~up-1
	dp[0][0]=1;
	int cur=0;
	for(int i=1;i<=n;i++)
	{
		cur^=1;
		memset(dp[cur],0,sizeof dp[cur]);
		memset(pos[cur],0,sizeof pos[cur]);
		memset(kuai[cur],0,sizeof kuai[cur]);
		for(int j=0;j<up;j++) //ÉÏÒ»´ÎµÄ״̬ 
		{
			if(dp[cur^1][j]==0) continue;
			//ÉϴεÄ״̬µ½ÏÖÔڻᷢÉú±ä»¯
			int now=0; //ÏÖÔÚµÄ״̬(»¹Ã»Óа´ÏµÚi¸ö)
			//ÅжÏÿ¸ùÊÖÖ¸µ½ÏÖÔÚµÄÊÇ·ñ±»ÊÍ·Å 
			for(int k=1;k<=4;k++) //ÊÖÖ¸ 
			{
				if(pos[cur^1][j][k]==0) now+=0,used[k]=0; //used[k]==0 ±íÃ÷±¾´Î¿ÉÒÔʹÓÃkÕâ¸ùÊÖÖ¸ 
				else
				{
					if(no[kuai[cur^1][j][k]].t <= no[i].s) //µÚk¸öÊÖÖ¸ÔÚµ±Ç°Õâ¸ö¿ªÊ¼Ö®Ç° ÒѾ­½â·Å 
					{
						now+=0,used[k]=0;
					}
					else now+=val[k],used[k]=1;
				}
			}
			for(int k=1;k<=4;k++) //ÓõÚk¸ùÊÖָȥ°´µÚi¸ö 
			{
				if(used[k]==1) continue;
				//ÅжÏÓõÚk¸ùÊÖָȥ°´µÚi¸öÊÇ·ñºÏ·¨ 
				bool f=true;
				for(int x=1;x<=4;x++)
				{
					if(k==x) continue;
					if(used[x])
					{
						if(x<k && pos[cur^1][j][x]>no[i].c) f=false;
						else if(x>k && pos[cur^1][j][x]<no[i].c) f=false;
					}
				}
				if(f)
				{
					dp[cur][now+val[k]]=1;
					for(int x=1;x<=4;x++)
					{
						if(x==k) pos[cur][now+val[k]][x]=no[i].c,kuai[cur][now+val[k]][x]=i;
						else
						{
							if(used[x]) pos[cur][now+val[k]][x]=pos[cur^1][j][x],kuai[cur][now+val[k]][x]=kuai[cur^1][j][x];
							else pos[cur][now+val[k]][x]=0,kuai[cur][now+val[k]][x]=0;
						}
					}
				} 
			}
		}
	} 
	bool f=false;
	for(int i=0;i<up;i++) if(dp[cur][i]) f=true;
	if(f) printf("Yes");
	else printf("No");
}
/*

5
1 5 1
2 6 2
3 7 3
4 8 4
5 9 5

no*/

上一题