.

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<<" ";
   }
}
A.cpp

 

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<<" ";
}
B.cpp

相关文章:

  • 2022-12-23
  • 2021-12-29
  • 2021-08-25
  • 2021-05-25
  • 2021-09-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-10
  • 2022-12-23
相关资源
相似解决方案