D1:思路:L,R指针移动,每次选最小的即可。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 200009 6 int arr[N]; 7 int ans[N]; 8 signed main(){ 9 int n; 10 cin>>n; 11 for(int i=1;i<=n;i++){ 12 cin>>arr[i]; 13 } 14 int l=1,r=n; 15 int cnt=0; 16 int now=0; 17 while(1){ 18 if(now<arr[l]&&now<arr[r]){ 19 if(arr[l]<arr[r]){ 20 21 ans[++cnt]=0; 22 now=arr[l]; 23 l++; 24 }else{ 25 26 ans[++cnt]=1; 27 now=arr[r]; 28 r--; 29 } 30 }else if(now<arr[l]){ 31 32 ans[++cnt]=0; 33 now=arr[l];l++; 34 }else if(now<arr[r]){ 35 36 ans[++cnt]=1; 37 now=arr[r];r--; 38 }else{ 39 break; 40 } 41 } 42 cout<<cnt<<' '; 43 for(int i=1;i<=cnt;i++){ 44 if(ans[i]) 45 cout<<"R"; 46 else 47 cout<<"L"; 48 49 } 50 return 0; 51 }
D1:思路:L,R指针移动,每次选最小的即可。【注意:特判左右两个数相等即可】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 200009 6 int arr[N]; 7 int ans[N]; 8 signed main(){ 9 int n; 10 cin>>n; 11 for(int i=1;i<=n;i++) cin>>arr[i]; 12 int l=1,r=n; 13 int cnt=0; 14 int now=0; 15 while(1){ 16 if(arr[l]==arr[r]&&l<r&&arr[l]>now){ 17 //cout<<"=="; 18 int temp; 19 temp=l; 20 int sum1=1; 21 while(arr[temp]<arr[temp+1]&&(temp+1)<r){ 22 temp++; 23 sum1++; 24 } 25 temp=r; 26 int sum2=1; 27 while(arr[temp]<arr[temp-1]&&(temp-1)>l){ 28 temp--; 29 sum2++; 30 } 31 if(sum1>sum2){ 32 ans[++cnt]=0; 33 now=arr[l]; 34 l++; 35 }else{ 36 ans[++cnt]=1; 37 now=arr[r]; 38 r--; 39 } 40 }else if(now<arr[l]&&now<arr[r]){ 41 if(arr[l]<arr[r]){ 42 ans[++cnt]=0; 43 now=arr[l]; 44 l++; 45 }else{ 46 ans[++cnt]=1; 47 now=arr[r]; 48 r--; 49 } 50 }else if(now<arr[l]){ 51 52 ans[++cnt]=0; 53 now=arr[l];l++; 54 }else if(now<arr[r]){ 55 56 ans[++cnt]=1; 57 now=arr[r];r--; 58 }else{ 59 break; 60 } 61 } 62 cout<<cnt<<' '; 63 for(int i=1;i<=cnt;i++){ 64 if(ans[i]) 65 cout<<"R"; 66 else 67 cout<<"L"; 68 } 69 return 0; 70 } 71 72 /* 73 1 3 5 4 2 1 74 15 75 37504 79054 80071 95721 135743 164345 189260 190810 191657 196168 200000 200000 190810 190018 185437 76 */
左右两端数都小于等于构造的数组的最后一个数字