B. Different Rules 数学/贪心/思维

LINK

给人数n,以及某个人在第一场比赛的排名x,在第二场比赛的 排名y,求这个人可能最高的排名以及最低的排名。
–>很好的视频题解!!!
首先考虑最低的排名可能也就是尽量的有和他排名和相等或者小于它排名和的情况:易得最多的可能是 X+Y-1组和为X+Y的取值情况
B. Different Rules 数学/贪心/思维_第1张图片
对于最优排名可能:
首先如果X+Y的和小于或者等于n,那么我们都有办法使得其他的选手的排名和大于n如: (1,n),(2,n-1),(3,n-2)…这种情况的显然最优排名为1;
即为 x+y<=n ans=1;
接着考虑 x+y>n的情况:我们考虑如果某个选手第一场比赛的排名是1,那么不论他第二场比赛的成绩怎么样排名和最多可能是n+1,不可能小于x+y ,贪心的考虑索性将他的第一场比赛以及第二场比赛的排名设为 1,同理之后某选手 的两场都设为2.。。。。划去前面的几位选手的情况 这就相当于X->X-t,Y->Y-t,n->n-t那么根据上面的规律x+y<=n ans=1; 当x-t+y-t=n-t时这位选手的排名为1 解t=x+y-n t表示在这位选手之前的选手数 ,ans=t+1

B. Different Rules 数学/贪心/思维_第2张图片

#include
using namespace std;
int main()
{
	int tt;scanf("%d",&tt);
	while(tt--)
    {
    	int n,x,y;scanf("%d%d%d",&n,&x,&y);
    	int minn=x+y>n?x+y-n+1:1;minn=min(minn,n);
		int maxx=x+y-1;maxx=min(maxx,n);
        cout<<minn<<" "<<maxx<<endl;
	 } 
}

你可能感兴趣的:(codeforce)