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 a≥3b,那么最多只能分 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;
}
(未完,其它待补)