UOJ Goodbye Bingshen

在叶子童鞋的推荐下参加了比赛,面对众多构造题和交互题感到挑战重重。本文分享了比赛中的解题思路及代码实现,包括“长度测量鸡”和“直径拆除鸡”等问题的解决方法。

在叶子童鞋的推荐下打了这场比赛...

感觉被虐爆了...

怎么这么多构造题...

我还没写过呢...

交互题是毛线...看了好久没看懂...就放弃了...(我语文好差QAQ...)

最后只会T1...T2没时间了,就随便水了一发...居然拿了30分(rp--)...

下面有一些是自己/小伙伴YY的想法...有一些是题解...先放官方题解...

就不放题面了...复制过来效果很神奇...

A. 长度测量鸡

分析:

这个你脑补一下,划分成的长度一定是1~n的某个全排列,然后算一算,发现能够组合出来的长度只有$\frac{n(n+1)}{2}$种,如果两两不同,那么就需要每一种长度都只被计算一次,然后就会发现,如果n>=3是做不到这一点的...详细证明请见题解...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;

int n,cas;

signed main(void){
	scanf("%d",&cas);
	while(cas--){
		scanf("%d",&n);
		if(n>3)
			puts("-1");
		else
			puts("1");
	}
	return 0;
}//Cap ou pas cap. Cap.

分析:

题解有点长...懒得看了...

这是一个神奇的想法...

我们枚举树高,然后除了最后一层的点,其他全都是三叉的,每一层的根节点前两个儿子都是一条链,第三个儿子递归...大概就是下面这张图...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;

int n,m;

inline int calc(int dep){
	int ans=0,tmp=dep,N=n;
	while(tmp)
		ans+=N,N-=tmp*2+1,tmp--;
	ans+=N;
	if(ans>=m){
		for(int i=dep,tot=0;i>=1;i--){
			int root=tot+1;
			tot+=2*i+1;
			for(int j=root+1;j<=i+root;j++)
				printf("%d %d\n",j==root+1?root:j-1,j);
			for(int j=root+i+1;j<=root+i+i;j++)
				printf("%d %d\n",j==root+i+1?root:j-1,j);
			printf("%d %d\n",root,root+i+i+1);
			if(i==1&&tot+1<n){
				for(int j=root+i+i+2;j<=n;j++)
					printf("%d %d\n",root,j);
			}
		}
	}
	return ans;
}

signed main(void){
	scanf("%d%d",&n,&m);
	if(n<=3){
		for(int i=2;i<=n;i++)
			printf("%d %d\n",1,i);
		return 0;
	}
	for(int i=1;i<=(n-1)/3;i++)
		if(calc(i)>=m)
			break;
	return 0;
}//Cap ou pas cap. Cap.

 


By NeighThorn 

 

转载于:https://www.cnblogs.com/neighthorn/p/6352140.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值