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 }

浙公网安备 33010602011771号