C. Playing Piano(dfs)

这篇具有很好参考价值的文章主要介绍了C. Playing Piano(dfs)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Problem - C - Codeforces

C. Playing Piano(dfs)

小Paul想学弹钢琴。他已经有了一首想要开始演奏的旋律。为简单起见,他将这个旋律表示为键号序列a1,a2,…,an:数字越大,它就越靠近钢琴键盘的右侧。

Paul非常聪明,知道关键是正确地为他要演奏的音符分配手指。如果他选择不方便的指法,那么他将浪费很多时间尝试学习如何用这些手指演奏旋律,他可能不会成功。

我们用数字1到5来表示手指。我们称任何手指数字序列b1,…,bn为指法。如果对于所有1≤i≤n−1,以下条件成立,则指法很方便:

如果ai<ai+1,则bi<bi+1,因为否则Paul需要从键盘上拿下手来演奏(i+1)次音符; 如果ai>ai+1,则bi>bi+1,原因相同; 如果ai=ai+1,则bi≠bi+1,因为连续使用同一个手指是愚蠢的,请注意bi和bi+1之间有≠而不是=。

请提供任何方便的指法,或者发现没有。

输入 第一行包含一个整数n(1≤n≤105),表示音符数量。

第二行包含n个整数a1,a2,…,an(1≤ai≤2⋅105),表示键盘上的音符位置。

输出 如果没有方便的指法,请打印-1。否则,打印n个数字b1,b2,…,bn,每个数字从1到5,用空格分隔,表示便利的指法。

Examples

input

Copy

5
1 1 4 2 2

output

Copy

1 4 5 4 5 

input

Copy

7
1 5 7 8 10 3 1

output

Copy

1 2 3 4 5 4 3 

input

Copy

19
3 3 7 9 8 8 8 8 7 7 7 7 5 3 3 3 3 8 8

output

Copy

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

题解:
遇到这种限制比较多的构造,且用于构造的数比较小,那我们可以直接进行dfs来求答案,注意所给的限制条件全都要用上

 文章来源地址https://www.toymoban.com/news/detail-430889.html

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
int a[100050];
int n;
int vis[100050][11];
int num[100050];
int dfs(int x)
{
	if(x == n)
	return 1;
	for(int i = 1;i <= 5;i++)
	{
		if(!vis[x + 1][i])
		{
			if((a[x] == a[x + 1]&&num[x] != i)||(a[x] > a[x + 1]&&num[x] > i)||(a[x] < a[x + 1]&&num[x] < i))
			{
				num[x + 1] = i;
				vis[x + 1][i] = 1;
				if(dfs(x + 1))
				return 1;
//				dfs(x + 1);
//				vis[x + 1][i] = 0;
			}
		}
	}
	return 0;
}
void solve()
{
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	int f = 0;
	for(int i = 1;i <= 5;i++)
	{
		num[1] = i;
		if(dfs(1))
		{
			f = 1;
			break;
		}
	} 
	if(f)
	{
		for(int i = 1;i <= n;i++)
		cout << num[i] <<" ";
	}
	else
	{
		cout <<"-1";
	} 
}
signed main()
{
//	ios::sync_with_stdio(0 );
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

到了这里,关于C. Playing Piano(dfs)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【每日一题】—— C. Game with Reversing (Codeforces Round 879 (Div. 2))

    🌏博客主页: PH_modest的博客主页 🚩当前专栏: 每日一题 💌其他专栏: 🔴 每日反刍 🟡 C++跬步积累 🟢 C语言跬步积累 🌈座右铭: 广积粮,缓称王! 题目大意: 题目链接:C. Game with Reversing (Codeforces Round 879 (Div. 2)) 翻字符串两次不会对答案造成影响,因此统计出初始

    2024年02月16日
    浏览(34)
  • Codeforces Beta Round 15 C. Industrial Nim Nim,1~n的异或和

    Problem - 15C - Codeforces 目录 Nim游戏: 1~n的异或和: 代码: n个石头堆,谁最后没得取谁败 我用的异或思考法,对所有堆异或。 开局异或和为0的败 最后全是0,异或完也是0. //最后是0,这位就输了 //A选手让异或和为0,B选手必须动一下,而他做任何操作都会使异或和不为0 //这

    2024年02月21日
    浏览(33)
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

    C. Digital Logarithm 给两个长度位 n n n 的数组 a a a 、 b b b ,一个操作 f f f 定义操作 f f f 为, a [ i ] = f ( a [ i ] ) = a [ i ] a[i]=f(a[i])=a[i] a [ i ] = f ( a [ i ]) = a [ i ] 的位数 求最少多少次操作可以使 a 、 b a、b a 、 b 两个数组变得完全相同 性质: 对于任何数,经过两次操作我们一定可以

    2024年02月20日
    浏览(31)
  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)

    C. Little Girl and Maximum Sum 给q个[l,r]将所有这些区间里面的数相加和最大。 可以进行的操作是任意排列数组 对出现的每个区间内的位置加上1,代表权值 操作完之后求一遍前缀和,得到每个位置的权值 然后贪心的考虑,权值越大,应该分配给该位置的数越大越好这样对答案的贡

    2024年02月21日
    浏览(29)
  • C. Salyg1n and the MEX Game Codeforces Round 897 (Div. 2)

    Problem - C - Codeforces 题目大意:有一个所有数互不相同的长度为n的数组n,A先手,可以向数组中假如一个没有的数x,B可以从数组中移除一个x的数,目标是使数组最终的MEX最小,扮演A进行操作,使数组最终的MEX最大 1=n=1e5;最大回合数为n 思路:我们要让当前数组的MEX增大,必

    2024年02月07日
    浏览(26)
  • 【每日一题】—— C. K-th Not Divisible by n (Codeforces Round 640 (Div. 4))

    🌏博客主页: PH_modest的博客主页 🚩当前专栏: 每日一题 💌其他专栏: 🔴 每日反刍 🟡 C++跬步积累 🟢 C语言跬步积累 🌈座右铭: 广积粮,缓称王! 题目大意:找第k个不能整除n的数字 题目链接:C. K-th Not Divisible by n (Codeforces Round 640 (Div. 4)) 这是一个找规律题 n前面

    2024年02月15日
    浏览(40)
  • Codeforces Round 916 (Div. 3)(E:贪心 F贪心dfs G tarjan+topsort +线段树优化建图)

    A:直接暴力统计每个字符的次数是否达标即可 B:直接先输出所需要的k,然后降序输出剩下的即可 C: 直接枚举最后操作到哪个位置就行了,然后贪心一直操作1到i的位置的b最大值即可 D: 先固定第一次是A 第二次是B 第三次是C 枚举B为中介点i,然后求1到i-1的A的最大值,和

    2024年01月17日
    浏览(31)
  • Editing While Playing 使用 Easyx 开发的 RPG 地图编辑器 tilemap eaitor

    AWSD移动画布 鼠标右键长按拖拽 鼠标左键长按绘制 可以边拖拽边移动画布边绘制。 F1 导出 DLC F2 导入DLC author: 民用级脑的研发记录 1309602336@qq.com 开发环境: 内置 easyx 的 devc++ 5.11 或者 VS 2022 TDM GCC 4.9.2 64-bit c++11及以上都可运行 windows 环境运行 源代码可复制粘贴直接跑 代码原

    2024年02月19日
    浏览(36)
  • 钢琴大师

    欢迎来到程序小院 开始游戏 https://www.ormcc.com/play/gameStart/245 源码 需要源码请关注添加好友哦^ ^ 转载:欢迎来到本站,转载请注明文章出处 https://ormcc.com/

    2024年02月03日
    浏览(26)
  • Html5钢琴块游戏制作(音乐游戏)

    当年一款手机节奏音游,相信不少人都玩过或见过。最近也是将其做了出来分享给大家。 游戏的基本玩法:点击下落的黑色方块,弹奏音乐。(下落的速度会越来越快)  可以进行试玩,手机玩起来效果会更好些。 点击试玩 游戏使用了一首儿歌乐谱,听出来是啥了吗^ ^ --

    2023年04月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包