20211203 CF1611

B \color{green}{\texttt{B}} B

[Solution] \color{blue}{\texttt{[Solution]}} [Solution]

下面讨论认为 a > b a>b a>b(如果 a < b a<b a<b,直接交换就好了)。

  • 如果 a ≥ 3 b a\geq 3b a3b,那么最多只能分 b b b 组(每组一名程序员和三名数学家)。
  • 其他情况下,我们先把每个组分一个程序员和一名数学家,然后再把数学家两两分到一组,再把程序员两两分到一组,如果都有剩余,再把一名数学家和一名程序员分到同一组。可以证明,最后一共有 ⌊ a + b 4 ⌋ \left \lfloor \dfrac{a+b}{4} \right \rfloor 4a+b 组。

[code] \color{blue}{\texttt{[code]}} [code]

int main(){
	for(int T=1,Q=read();T<=Q;T++){
		math=read();prog=read();
		
		if (math<prog) swap(math,prog);
		
		printf("%d\n",min(prog,(math+prog)/4));
	}
	
	return 0;
}

C \color{green}{\texttt{C}} C

[Solution] \color{blue}{\texttt{[Solution]}} [Solution]

显然地,最大的数(即 n n n)一定在 a a a 的两侧,如果不符合这个条件,那么答案一定是 − 1 -1 1

考虑与最大数相邻的那个数,它一定比最大数小,按照题意,如果在 a a a 中它在最大数的左(右)边,那么在 p p p 中它就在最大数的右(左)边。

以此类推,我们可以找到一个非常妙的方法:即把 a a a 数组逆序输出,就是可能的 p p p 数组。

[code] \color{blue}{\texttt{[code]}} [code]

int main(){
	for(int T=1,Q=read();T<=Q;T++){
		n=read();
		for(int i=1;i<=n;i++)
			a[i]=read();
		
		if (a[1]!=n&&a[n]!=n)
			printf("-1\n");
		else{
			for(int i=n;i>=1;i--)
				printf("%d ",a[i]);
			printf("\n");
		}
	}
	
	return 0;
}

(未完,其它待补)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值