首页 > 其他分享 >P9578「Cfz Round 1」Permutation

P9578「Cfz Round 1」Permutation

时间:2023-08-27 10:45:24浏览次数:29  
标签:两侧 P9578 最小值 最大值 times 加数 Cfz ha Round

思路

我们需要尽量让相邻两个数的和的最大值减最小值最小。

先思考如何让最大值最小。

对于 \(n\),两侧最小也必须要放 \(1\) 和 \(2\)。所以最大值至少也是 \(n+2\)。

同时,我们再思考 \(1\) 周围能摆什么,因为不能让最小值太小,我们需要放比较大的,也就是 \(n\) 和 \(n-1\)。

这样来看的话,最小值最大是 \(n\)。

所以除了 \(n=1\) 或者 \(n=2\) 的特殊情况外,我们要构造的序列的值最小是 \(2\)。

再来思考一下能不能达成 \(2\),对于大于 \(\lceil\frac n 2\rceil\) 的 \(i\),他的两侧可以放 \(n-i+2\) 和 \(n-i+1\)。对于小于 \(\lfloor \frac n 2\rfloor\) 的 \(i\),他的两侧可以放 \(n-i+1\) 和 \(n-i\)。可以验证这样摆放再处理一下 \(n\) 为偶数的特殊情况,就可以使值为 \(2\)。

那么,我们在思考如何生成序列。

首先可以确定 \(n\) 的位置,在它的两侧放上 \(1\) 和 \(2\),再在 \(1\) 旁边的空位摆上 \(n-1\),在 \(2\) 旁边的空位摆上 \(n-2 \cdots\)。

可以发现,这种构造方式可以换一种描述方式。

先摆一个 \(n\),然后每次在两侧加数,第 \(2\times k-1\) 次加数会在两侧分别加 \(2\times k-1\) 和 \(2\times k\),第 \(2\times k\) 次加数会在两侧分别加 \(n-2\times k+1\) 和 \(n-2\times k\)。

如果最后还剩一个也就是 \(n\) 为偶数时,可以把剩下的数放在任意两端。

AC code

#include<bits/stdc++.h>
using namespace std;
int n,a,b[1000005],now,cnt=1,mi,ma,ha;
int main()
{
	scanf("%d",&n),now=n,mi=1,ma=n-1,ha=ceil(1.0*n/2),b[ha]=n;//懒得算每次摆的是什么数,于是就用两个变量存一下,ha记录中间的位置
	while(cnt<=(n-1)/2)
		if(cnt&1) b[ha-cnt]=mi,b[ha+cnt]=mi+1,mi+=2,++cnt;
		else b[ha-cnt]=ma,b[ha+cnt]=ma-1,ma-=2,++cnt;//按照上面的方法摆放数字
	if(n%2==0) b[n]=mi;//n为偶数时的情况
	for(int i=1;i<=n;++i) printf("%d ",b[i]);//输出
	return 0;
}

标签:两侧,P9578,最小值,最大值,times,加数,Cfz,ha,Round
From: https://www.cnblogs.com/One-JuRuo/p/17659967.html

相关文章

  • 【LGR-156-Div.3】洛谷网校 8 月普及组月赛 I & MXOI Round 1 & 飞熊杯 #2(同步赛)
    【LGR-156-Div.3】洛谷网校8月普及组月赛I&MXOIRound1&飞熊杯#2(同步赛)\(T1\)luoguP9581宝箱\(100pts\)水题,模拟即可。intmain(){ inta,b,ans=0; cin>>a>>b; if((a<0&&b<0)||(a>0&&b>0)) { cout<<max(abs(a),abs......
  • 【CFVP】Codeforces Round 851 (Div. 2)
    前言本场VP深感自己的弱小与史队的强大。又一次被史队全方位暴打。来做一个简要的总结。正文A.OneandTwoA题日常的愚蠢。考虑到原序列只含有质因子2。我们将质因子2平分给左右两边即可。当2的个数为奇数时即判断为无解。代码:#include<bits/stdc++.h>usingnamespace......
  • 【LGR-153-Div.2】梦熊联盟 8 月月赛 Ⅳ & Cfz Round 1 & 飞熊杯 #1
    【LGR-153-Div.2】梦熊联盟8月月赛Ⅳ&CfzRound1&飞熊杯#1\(T1\)「CfzRound1」DeadCells\(100pts\)正解:模拟(注意特判)llgcd(lla,llb){ returnb?gcd(b,a%b):a;}intmain(){ lla,b,k,d,i,ans=1; a=read();b=read();k=read(); d=a/gcd(a,b)*b; f......
  • Codeforces Round 894 (Div. 3) ABCDEFG AK
    CodeforcesRound894(Div.3)第一次div3ak,虽然是vp的,后三题质量不错A-GiftCarpet穷举四个不同列即可,时间复杂度\(O(M^4)\)inta[100][100];voidsolve(){memset(a,0,sizeofa);intn,m;cin>>n>>m;for(inti=1;i<=n;i++)......
  • 2023.8.26 LGJ Round
    A有\(n\)个序列,每个序列长度\(m_i\),每个序列的每个数有权值\(c{i,j}\)。\(\summ_i\len\le10^5\).A和B轮流行动,A只能选择一个序列获得其开头数的权值并删去,B只能选择一个序列获得其末尾数的权值并删去。问A,B分别最多获得多少权值。若所有序列长度为偶数,可以证......
  • Codeforces Round 894 (Div. 3)
    CodeforcesRound894(Div.3)因为最近开学了,所以晚上可能就没有什么时间打这个了,不过以后一定会在第二天把题给补掉A题传送门A题意:就是在一个n*m的的字符矩阵中从左往右依次取出4列,使得每列包含vika这四个字符中按顺序出现一个。必须保证是按顺序出现。A思路:这是一个简......
  • 2023.8.25 LGJ Round
    AAlice和Bob玩一个游戏,Alice先手。有一个长度为偶数的字符串,每次取出该字符串最前或最后的字符并删掉,并把该字符加入自己的字符串末尾。双方都采取最优策略,问谁的字符串字典序更小,或相同。区间dp.\(dp_{i,j}\)表示\([i,j]\)这个区间先手必胜/必败/平局。初始\(dp_{......
  • Codeforces Round 894 (Div. 3) A-F题解
    A.GiftCarpet题意最近,特马和维卡庆祝了家庭日。他们的朋友Arina送给他们一块地毯,这块地毯可以用拉丁文小写字母的\(n\cdotm\)表来表示。维卡还没看过礼物,但特马知道她喜欢什么样的地毯。如果维卡能在地毯上读出自己的名字,她一定会喜欢的。她从左到右逐列阅读,并从当前列中......
  • 关于周考 Round 11 吐槽 & 自己如何犯智
    T1卡map。map\(\to\)unordered_map,\(10\to100\)。为什么别人认为这是卡longlong?(好像都卡了。:sad:)T3一眼dp然后否决掉了,写了个搜索,并且认为搜索是正解,并且调了很久发现假了,我是Joker。T4看到了\(u_i<v_i\)但是neglected!!1然后我不会倒序dp而是dfs!!!而且可......
  • 2023.8.24 LGJ Round
    A有\(n(n\le750)\)个正整数\((a_i\le10^9)\),你需要删除一些数,使得剩下的数两两加起来都不为质数。若\(a_i+a_j\in\text{prime}\)(这里使用Miller-Rabin即可),将\(i\)和\(j\)连边。我们就是要求一个最大独立集。一般图是求最大独立集是NP问题。但是我们发现去掉所......