079C.D Decrease 构造+思维
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了079C.D Decrease 构造+思维相关的知识,希望对你有一定的参考价值。
题意:op:选出最大值减去n,其余值加上1. 构造出长度为n的序列,使得其经过k次操作后,每个元素都小于等于n-1. k<=1e16
逆操作:选一个元素加上n,其余减去1.(经过逆操作后,加上n个要为最大,其余不能<0)
k次操作后每个元素都小于等于n,最后的序列若能经过k次合法的逆操作就能得到答案.
构造最后的序列为
:0,1,2...n-1 k=0
:n,0,1...n-2 k=1
:n-1,n,0,.n-3 k=2
.....
2,3,4.....0 k=n-1.
1,2,3.....n k=n 经过n次操作后的序列和初始偏差一
则最后的序列开头为k/n...剩下k%n个操作暴力即可.
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+20; const ll inf=1e16+1000; ll k,n,a[N]; int main() { while(cin>>k) { n=50; ll num=k/n,re=k%n; for(int i=1;i<=n;i++) a[i]=num+i-1; for(int p=1;p<=re;p++) { for(int i=1;i<=n;i++) { if(i==p) a[i]+=n; else a[i]--; } } printf("%lld\n",n); for(ll i=1;i<=n;i++) printf("%lld%c",a[i],i==n?‘\n‘:‘ ‘); } return 0; } //25720164523 //154320986863 //500000000000000000
题意:操作如上题,给出长度为n的序列a[i],为经过多少次操作后每个元素的值都小于等于n-1.
n<=50 a[i]<=1e16。
每次操作总和减小1,l=sum-n*(n-1) r=sum n^2枚举ans
等价操作:先给每个元素加上x后,还剩下x次减n+1操作.
若有元素大于n-1则 肯定要用减法 判断使用次数是否超过即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+20; const ll inf=1e16+1000; ll a[N]; int n; int main() { while(cin>>n) { ll sum=0; for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i]; ll l=sum-n*(n-1),r=sum; for(ll k=l;k<=r;k++) { if(k<0) continue; ll res=0; bool ok=true; for(int i=1;i<=n;i++) { ll dif=max(0ll,a[i]+k-n+1); ll x=dif/(n+1); if(dif%(n+1)) x++; res+=x; } if(res==k) { cout<<res<<endl; break; } } } return 0; } //25720164523 //154320986863 //500000000000000000
以上是关于079C.D Decrease 构造+思维的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | DexFile loadDexFile 函数 | 构造函数 | openDexFile 函数 )(代码片
LeetCode-面试算法经典-Java实现106-Construct Binary Tree from Inorder and Postorder Traversal(构造二叉树II)(示例(代码片