新手赛263,补题:
C:Monotonically Increasing
实现单调递增序列
-
vector存储:也可使用数组;
-
数组存放0、1进行标记判断;0代表重复的n个数,1代表m-n个数;
-
对其上数组进行全排列;
-
全排列数组判断如果i位置为0则输出数据为i+1;
-
#include <bits/stdc++.h> using namespace std; int main() { int n,m; cin>>n>>m; vector<int> a; for(int i=0;i<n;i++) a.push_back(0); for(int i=0;i<m-n;i++) a.push_back(1); do{ for(int i=0;i<m;i++){ if(a[i]==0) cout<<i+1<<" "; } cout<<endl; }while(next_permutation(a.begin(),a.end())); }
D:左右操作:dp
注意:开longlong
-
设数组a存放前i个数的最小值,当前j个数的最小和确定,就可以找到总最小值res,循环判断找到a[i]加后面的被r更新的值
-
#include<bits/stdc++.h> using namespace std; const int N=2e5+10; #define ll long long ll a[N],m=3e14; ll n,l,r; int main() { cin>>n>>l>>r; for(int i=1;i<=n;i++) { ll x; cin>>x; a[i]=min(a[i-1]+x,l*i); } for(int j=0;j<=n;j++) { m=min(m,a[j]+r*(n-j)); } cout<<m<<endl; }
3.遍历时注意枚举范围:0~n;意味着,右边更新范围:n-0;
字符串消除、判相同可使用栈进行操作;
-
待更