Codeforces Round #522 (Div. 2) C. Playing Piano
C. Playing Piano
题目链接:https://codeforces.com/contest/1079/problem/C
题意:
给出数列{an},现在要求你给出一个数列{bn},满足:
1.当an+1>an时,有bn+1>bn;2.当an+1=an时,有bn+1!=bn;3.当an+1<an时,有bn+1<bn。 且满足1<=bn<=5。
题解:
我们可以考虑动态规划,设dp(i,j)为第i位置时,b(i)=j是否可行。
那么状态转移时可以分ai>ai-1,ai=ai-1,ai<ai-1三种情况考虑,同时记录一下路径方便输出。
具体见代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+;
int dp[N][],path[N][];
int n ;
int a[N];
int main(){
cin>>n;
for(int i=;i<=n;i++) cin>>a[i];
for(int i=;i<=;i++) dp[][i]=;
for(int i=;i<=n;i++){
for(int j=;j<=;j++){
if(dp[i-][j]==) continue ;
if(a[i]>a[i-]){
for(int k=j+;k<=;k++){
dp[i][k]=;
path[i][k]=j;
}
}else if(a[i]<a[i-]){
for(int k=;k<j;k++){
dp[i][k]=;
path[i][k]=j;
}
}else{
for(int k=;k<=;k++){
if(k==j) continue ;
dp[i][k]=;
path[i][k]=j;
}
}
}
}
int ok = ,j;
for(int i=;i<=;i++) if(dp[n][i]) ok=,j=i;
if(!ok){
printf("-1");
return ;
}
stack <int> s;
for(int i=n;i!=;i--){
s.push(j);
j=path[i][j];
}
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
return ;
}
Codeforces Round #522 (Div. 2) C. Playing Piano的更多相关文章
- Codeforces Round #184 (Div. 2) E. Playing with String(博弈)
题目大意 两个人轮流在一个字符串上删掉一个字符,没有字符可删的人输掉游戏 删字符的规则如下: 1. 每次从一个字符串中选取一个字符,它是一个长度至少为 3 的奇回文串的中心 2. 删掉该字符,同时,他 ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) Solution
A. Kitchen Utensils Water. #include <bits/stdc++.h> using namespace std; #define N 110 int n, ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) C. Playing Piano
题意:给出一个数列 a1 a2......an 让你构造一个序列(该序列取值(1-5)) 如果a(i+1)>a(i) b(i+1)>b(i) 如果a(i+1)<a(i) 那么b( ...
- Codeforces Round #296 (Div. 2) A. Playing with Paper
A. Playing with Paper One day Vasya was sitting on a not so interesting Maths lesson and making an o ...
- 水题 Codeforces Round #296 (Div. 2) A. Playing with Paper
题目传送门 /* 水题 a或b成倍的减 */ #include <cstdio> #include <iostream> #include <algorithm> ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)B. Personalized Cup
题意:把一长串字符串 排成矩形形式 使得行最小 同时每行不能相差大于等于两个字符 每行也不能大于20个字符 思路: 因为使得行最小 直接行从小到大枚举即可 每行不能相差大于等于两个字符相当于 ...
- Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3) D. Barcelonian Distance 几何代数(简单)
题意:给出一条直线 ax +by+c=0 给出两个整点 (x1,y1) (x2,y2) 只有在x,y坐标至少有一个整点的时 以及 给出的直线才有路径(也就是格子坐标图的线上) 问 两个整点所需要 ...
- Codeforces Round #522 Div. 1 没打记
开场被A劝退,写了得有50min于是不敢交了.unrated了喜闻乐见. A:瞎猜都能猜到如果要走到那条直线上,进入直线的点横坐标或纵坐标与起点相同,离开直线的点横坐标或纵坐标与终点相同,证明脑补一下 ...
- Codeforces Round #277 (Div. 2) 题解
Codeforces Round #277 (Div. 2) A. Calculating Function time limit per test 1 second memory limit per ...
随机推荐
- Docker虚拟化容器的使用
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Li ...
- laravel-多条件查询并指定key输出
$room = DB::table('room') ->where(function($query) use($contList){ foreach ($contList as $k=>$ ...
- 零基础学css第二天
内边距与外边距: <!DOCTYPE html> <html> <head> <title></title> <style type= ...
- 3 Mongodb数据查询1
1.基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty():将结果 ...
- MySQL之查询性能优化(四)
优化特定类型的查询 COUNT()的作用 COUNT()是一个特殊函数,有两个非常不同的作用:它可以统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL). 如果在COUN ...
- 编译IOS下 libpcap1.7.2
1.修改build-libpcap.sh libpcap版本号 2.执行脚本编译 出现问题: 2.发现configure过后,Makefile存在问题 实际configure的-arch armv7s ...
- 内存压缩PK页面交换 解决内存问题谁更在行
一台服务器能够支持的虚拟机数量通常取决于物理硬件所能够提供的可用计算资源.大多数资源, 比如处理器周期.存储I/O和网络带宽等,都能够相对简单地进行共享.这种做法的原理在于负载并不总是处于忙碌状态,因 ...
- runtime怎么添加属性、方法等
ivar表示成员变量 class_addIvar class_addMethod class_addProperty class_addProtocol class_replaceProperty
- CSS3 3D圆形设计教程
http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502061338.html
- 《Cracking the Coding Interview》——第18章:难题——题目4
2014-04-29 01:05 题目:数数从0到n总共有多少个数字‘2’? 解法:数位动态规划,可以O(log10(n))时间内解决. 代码: // 18.4 Count the number of ...