Newcoder 58 A.旅游观光(构造)

探讨在一个由n个地点构成的网络中,利用特定的公交票价规则,找到遍历所有地点的最低花费。票价规则依据地点编号计算,采用巧妙的策略,证明了最优解的存在,并给出了一种构造最优路径的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

nnn个地方,编号为1→n1\rightarrow n1n,任意两个地方有公交车,从iiijjj的票价为(i+j) mod (n+1)(i+j)\ mod\ (n+1)(i+j) mod (n+1),而且这个票可以用无限次,你要把这些地方全部走一遍,问最小花费为多少。可以在任意地方开始和结束。

Input

第一行一个数nnn

(1≤n≤105)(1\le n\le 10^5)(1n105)

Output

输出一行一个数表示答案

Sample Input

10

Sample Output

4

Solution

满足(i+j) mod (n+1)=0,i≠j(i+j)\ mod\ (n+1)=0,i\neq j(i+j) mod (n+1)=0,i̸=j的二元组(i,j)(i,j)(i,j)至多⌊n2⌋\lfloor\frac{n}{2}\rfloor2n个,这些二元组之间的过渡每次至少需要111个代价,故答案下界为⌊n−12⌋\lfloor\frac{n-1}{2}\rfloor2n1(需要分奇偶讨论一下),而我们只需要按下面的方式构造即可

(1,n)→(2,n−1)→...→(i,n+1−i)→(i+1,n−i)→...(1,n)\rightarrow (2,n-1)\rightarrow...\rightarrow (i,n+1-i)\rightarrow (i+1,n-i)\rightarrow...(1,n)(2,n1)...(i,n+1i)(i+1,ni)...

故该下界可以取到,答案为⌊n−12⌋\lfloor\frac{n-1}{2}\rfloor2n1

Code

#include<cstdio>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d\n",(n-1)/2);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值