.
A. Adjacent Replacements
执行1e9次命令,输出的最后数组的样子
一个奇数执行两次命令 会变回原来的数字
一个偶数只会执行一次命令 变成比自身小1的数
#include<bits/stdc++.h> #define int long long #define MAX(a,b,c) max(a,max(b,c)) #define MIN(a,b,c) min(a,min(b,c)) #define pb push_back #define fi first #define se second typedef long long ll; typedef long long LL; typedef unsigned long long ull; typedef unsigned long long uLL; using namespace std; const int maxn=1e6+10; const int INF=1e15; int a[maxn]; int32_t main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { if(a[i]%2==1) cout<<a[i]<<" "; else cout<<a[i]-1<<" "; } }
B. Polycarp's Practice
给出 数组n k 将数组分成k段(每段至少1) 求k段每段中最大数的和的最大值
排序一下 最大的n个数就是数字最大的
将k个最大数标记 我用的map 标记
然后扫一遍输出 第一个标记前的非标记的个数和自身 标记和标记间的个数 最后一个标记和标记间还有标记后的个数
例子
1 2 3 2 1 4 1 5 1 3
mp[3]=1; mp[2]=1; mp[5]=1; 这是被标记的
分成的为 1 2 3 2 1 4 1 5 1 3 三段
#include<bits/stdc++.h> #define int long long #define MAX(a,b,c) max(a,max(b,c)) #define MIN(a,b,c) min(a,min(b,c)) #define pb push_back #define fi first #define se second typedef long long ll; typedef long long LL; typedef unsigned long long ull; typedef unsigned long long uLL; using namespace std; const int maxn=1e6+10; const int INF=1e15; int a[maxn]; int b[maxn]; map<int,int> mp; int32_t main() { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) {cin>>a[i]; b[i]=a[i];} sort(a+1,a+1+n); int ans=0; int num=k; for(int i=n;i>=1;i--) { if(num) {ans+=a[i]; num--; mp[a[i]]++; } } cout<<ans<<endl; int t=0; for(int i=1;i<=n;i++) { if(mp[b[i]]&&k!=1) { cout<<t+1<<" "; t=0; mp[b[i]]--; k--; } else { t++; } } cout<<t<<" "; }