codeforces C. Playing Piano ###K ###K //K

题目链接:https://codeforces.ml/contest/1032/problem/C

题意:给定一个数组 要求 当a[i]<a[i-1]时 你构造的第i个数 也要b[i]<b[i-1] 当a[i]>a[i-1]时 要b[i]>b[i-1]

当a[i]==a[i-1]时 要b[i]!=b[i-1] 并且你构造的b[i] 只能是1~5 这5个数 问能否构造出这样的数组并输出 否则输出-1

思路:直接考虑贪心发现很难考虑 因为每一种都会影响后续使得步骤变得繁琐

直接考虑dp  dp[i][j] 表示到第i个数并且当前这个数为j时是否合法  那么就可以枚举前一个数是什么来转移了

时间复杂度 O(25n)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int mod=1e4;
 6 const int maxn=1e5+10;
 7 int dp[maxn][6];
 8 int pre[maxn][6];
 9 int a[maxn];
10 
11 
12 int main()
13 {
14     ios::sync_with_stdio(0);
15     cin.tie(0);
16     int n;
17     cin>>n;
18     for(int i=1;i<=n;i++)
19     {
20         cin>>a[i];
21     }
22     for(int i=1;i<=5;i++)
23         dp[1][i]=1;
24     for(int i=2;i<=n;i++)
25     {
26         for(int j=1;j<=5;j++)
27         {
28             if(dp[i-1][j]==0)
29                 continue;
30             if(a[i]>a[i-1])
31             {
32                 for(int k=j+1;k<=5;k++)
33                 {
34                     dp[i][k]=1;
35                     pre[i][k]=j;
36                 }
37             }
38             else if(a[i]==a[i-1])
39             {
40                 for(int k=1;k<=5;k++)
41                 {
42                     if(k==j)
43                         continue;
44                     dp[i][k]=1;
45                     pre[i][k]=j;
46                 }
47             }
48             else
49             {
50                 for(int k=1;k<j;k++)
51                 {
52                     dp[i][k]=1;
53                     pre[i][k]=j;
54                 }
55             }
56         }
57     }
58     int f=0;
59     for(int i=1;i<=5;i++)
60     {
61         if(dp[n][i])
62         {
63             f=i;
64             break;
65         }
66     }
67     if(f==0)
68         cout<<-1<<'\n';
69     else
70     {
71         vector<int>ans;
72         ans.pb(f);
73         for(int i=n;i>=2;i--)
74         {
75             f=pre[i][f];
76             ans.pb(f);
77         }
78         reverse(ans.begin(),ans.end());
79         int len=ans.size();
80         for(int i=0;i<len;i++)
81         {
82             if(i!=0)
83                 cout<<" ";
84             cout<<ans[i];
85         }
86         cout<<'\n';
87     }
88 
89 
90 
91 
92 }
View Code

 

posted @ 2020-12-05 23:59  canwinfor  阅读(84)  评论(0)    收藏  举报