传送门
http://codeforces.com/contest/1313/problem/B
题意
有n位参赛者参加两轮比赛,小明同学获得的名次是x和y,其他人的名次是未知的,求小明在两次比赛中的最高排名和最低排名,排名要求是相当于第几名就扣多少分,最后扣分越少的参赛者排名越高,假设扣分相同,则所有人都排当前的最后一名。
思路
1.先来看看最差名次,最差名次很好想,尽量多构造和小明同学扣分数相同的参赛者,小明的最终扣分为x+y
1 x+y-1
2 x+y-2
… …
x y
… …
x+y-1 1
最终小明的排名为min(n,x+y-1);
2.再来看看最高名次,当x+y<n+1时,可以构造
1 n
2 n-1
… …
n 1
当然这时候小明就排到了第一名
当x+y>=n+1时,就可以先让扣分少的组合在一起
1 1
2 2
… …
x y
再把第一名去掉后的排名就是x-1+y-1;最后怎么来确定其排名
才是本题的关键,依次进行上一步骤 x-t+y-t=n-t时,这就先组合了t组排名高的,t=x+y-n,那么多个人,最后小明就排在t+1位,所有其最高名次为min(n,x+y-n+1)
AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
if(x>y) swap(x,y);
int ansx,ansi;//最差名次,最好名次
ansx=min(n,x+y-1);
if(x+y<n+1) ansi=1;
else ansi=min(n,x+y-n+1);
printf("%d %d\n",ansi,ansx);
}
return 0;
}