Unfair contest(个人做法)

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unfair contest(个人做法)相关的知识,希望对你有一定的参考价值。

Unfair contest

题意:

两个人参赛,n个评委打分,去掉s个最高分,去掉t个最低分,剩下分求平均分,平均分大的获胜。你是第n个评委,此时已知前n-1个评委所打分数,现在轮到你打分,要求你在保证第一个人获胜的情况下,使得a-b最小(a为你给第一个人打的分数,b为你给第二个人打的分数)

题解:

我和队友是这样想的:
目前已经有n-1对分数已经确定,此时要去掉s个最高分,t个最低分,那我们将最高的s-1个分数舍弃,最低的t-1个舍去,因为无论第n个人怎么取分,都必然要舍去。好,现在问题就成了,剩下成绩中要去掉一个最高分,一个最低分,然后问第n个人如何打分?
因为第n个人不知道他打分如何?他的打分决定了到底哪个最大值和最小值被舍弃,有可能是第n个的成绩被舍弃,也有可能是之前成绩的最高分被舍弃,因此需要我们去分类讨论
九种情况(对于第一个人三种情况,第二个人三种情况),三种分别是:c在s后,c在st之间,c在t后,我们简称第n个人的评分为c,之前n-1个成绩的最高分和最低分分别是s和t

  1. 对于第一个人c<s,对于第二个人c<s,此时去掉最高分t,去掉最低分c(对于两个人都是)
  2. 对于第一个人c<s,对于第二个人c>t
  3. 对于第一个人c<s,对于第二个人s<c<t
  4. 对于第一个人s<c<t,对于第二个人c<s
  5. 对于第一个人s<c<t,对于第二个人s<c<t
  6. 对于第一个人s<c<t,对于第二个人c>t
  7. 对于第一个人c>t,对于第二个人c<s
  8. 对于第一个人c>t,对于第二个人s<c<t
  9. 对于第一个人c>t,对于第二个人c>t

    我们先把蓝色部分统计好,然后分九种情况依次去判断是否符合要求,记录最大差值,一定不重不漏。
    分类讨论每种情况下的最大差值,很麻烦,我和队友一点点分析才写完。
    但是一直wa,因为我们忘了特判s=0,t=0的各种情况,如果s=0,t=0,说明不用去掉最大最小值,此时最左侧和最右侧时c的取值情况,在完成初始化后,依旧判断。初始化0和n+1的情况,因为这是c的取值
	a[0]=1;
	a[n+1]=h;
	b[0]=1;
	b[n+1]=h; 

我也说不上明白,我们这个方法很麻烦,但是能做出来,详细看看代码理解

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
ll T,s,t,h,n;
ll a[maxn];
ll b[maxn];
int main()
{
	//freopen("input.txt","r",stdin); 
	//freopen("output.txt","w",stdout); 
	cin>>T;
	while(T--)
	{
		cin>>n>>s>>t>>h;
		swap(s,t);
		int flag=0;
		ll ans=inf;
		for(int i=1;i<=n-1;i++)scanf("%d",&a[i]);
		for(int i=1;i<=n-1;i++)scanf("%d",&b[i]);
		sort(a+1,a+n);
		sort(b+1,b+n);
		ll upqd=0;
		ll dwqd=0;
		n--;
		a[0]=1;
		a[n+1]=h;
		b[0]=1;
		b[n+1]=h; 
		for(int i=s+1;i<=n-t;i++)
		{
			upqd+=a[i];
			dwqd+=b[i];
		}
		
		ll tupqd=upqd;
		ll tdwqd=dwqd;
		//1 s s
		tupqd=upqd+a[s];
		tdwqd=dwqd+b[s];
		if(tupqd>tdwqd)
		{
			flag=1;
			ans=min(ans,1-b[s]);
		}
		//2 s t
		tupqd=upqd+a[s];
		tdwqd=dwqd+b[n-t+1];
		
		if(tupqd>tdwqd)
		{
			flag=1;
			ans=min(ans,1-h);
		}
		//cout<<flag<<endl;
		//3 s c
		tupqd=upqd+a[s];
		tdwqd=dwqd;
		//cout<<tupqd<<" "<<tdwqd<<endl;
		//cout<<flag<<endl;
		if(tupqd>tdwqd+b[s])
		{
			flag=1;
			ll tmp=min(tupqd-tdwqd-1,b[n-t+1]);
			ans=min(ans,1-(tmp));//
		}
		//4 c s
		//cout<<flag<<endl;
		tupqd=upqd;
		tdwqd=dwqd+b[s];
		if(tupqd+a[n-t+1]>tdwqd)
		{
			flag=1;
			ll tmp=max(tdwqd-tupqd+1,a[s]);
			ans=min(ans,tmp-b[s]);
		}
		//5 c c
		//cout<<ans<<endl;
		tupqd=upqd;
		tdwqd=dwqd;
		if(tupqd+a[n-t+1]>tdwqd+b[s])
		{
			flag=1;
			ll tmp=max((tdwqd-tupqd)+1,a[s]-b[n-t+1]);
			ans=min(ans,tmp);
		}
		//6 c t
		tupqd=upqd;
		tdwqd=dwqd+b[n-t+1];
		if(tupqd+a[n-t+1]>tdwqd)
		{
			flag=1;
			ll tmp=max(a[s],tdwqd-tupqd+1);
			ans=min(ans,tmp-h);
		}
		
		//7 t s
		tupqd=upqd+a[n-t+1];
		tdwqd=dwqd+b[s];
		if(tupqd>tdwqd)
		{
			flag=1;
			ans=min(ans,a[n-t+1]-b[s]);
		}
		//8 t c
		tupqd=upqd+a[n-t+1];
		tdwqd=dwqd;
		if(tupqd>tdwqd+b[s])
		{
			flag=1;
			ll tmp=min((tupqd-tdwqd-1),b[n-t+1]);
			ans=min(ans,a[n-t+1]-tmp);
		}
		//9 t t
		tupqd=upqd+a[n-t+1];
		tdwqd=dwqd+b[n-t+1];
		if(tupqd>tdwqd)
		{
			flag=1;
			ans=min(ans,a[n-t+1]-h);
		}
		if(flag)
		cout<<ans<<endl;
		else cout<<"IMPOSSIBLE"<<endl;
	}
	return 0;
}

以上是关于Unfair contest(个人做法)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 392 C Unfair Poll(模拟)

使用单个片段显示UI而不是活动是一种好习惯吗?

CF758C Unfair Poll

json 个人的vscode的代码片段

CodeFroces 758C - Unfair Poll

Codeforces 758C:Unfair Poll(思维+模拟)