寒假一期训练2 gym103483

Posted yeah17981

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假一期训练2 gym103483相关的知识,希望对你有一定的参考价值。

Problem - D - Codeforces

给n天,每天想考试的人数和每天能考的人数,求学生移动次数最小值

题解:二分w,第i天的学生只能从i移到i-w到i之间的任意位置,求出ans

(可能也许这么做的,发现队友补了就摸了)

Problem - E - Codeforces

给n个数,代表n个人每个人手中的金额,有个劫匪来抢劫,他选择两个数k,t,则抢劫k-n这部分人的钱,使得这部分人原有a[i]的钱变成(1-t)*a[i],劫匪想让抢劫后的贫富差距(最大值-最小值)最小,问当k的值为1-n时对应的t应该是多少

预处理出前i个的最大值maxx1[i]和最小值minn1[i],反向求出maxx2和minn2

最终结果应该是:max(maxx1[i],(1-t)*maxx2[i])-min(minn1[i],(1-t)*minn2[i]);

于是使前面尽可能小,后面尽可能大

对两对最值比较

1、maxx1>maxx2 minn1>minn2 取(1-t)=1 记t1=0


2、maxx1>maxx2 minn1<minn2 取 minn1=(1-t)*minn2 记t2


3、maxx1<maxx2 minn1>minn2 取maxx1=(1-t)*maxx2 记t3


4、maxx1<maxx2 minn1<minn2 
4.1、t2>t3 0-t3-t2-1 分为三段
1:maxx1<(1-t)*maxx2 minn1<(1-t)*minn2  取t3
2:maxx1<(1-t)*maxx2 minn1>(1-t)*minn2  取t3
3:maxx1>(1-t)*maxx2 minn1>(1-t)*minn2  取t2
4.2、t2<t3 0-t2-t3-1
1:maxx1<(1-t)*maxx2 minn1<(1-t)*minn2  取t2
2:maxx1>(1-t)*maxx2 minn1<(1-t)*minn2  取t3
3:maxx1>(1-t)*maxx2 minn1>(1-t)*minn2  取t3

因此我们发现只有三种结果

直接带入即可


#include<bits/stdc++.h> 
using namespace std;
int a[1000000];
double maxx1[1000000],minn1[1000000];
double maxx2[1000000],minn2[1000000];
struct XD
	double nu,t;
;
XD ans[5];
bool cmp(XD a,XD b)

	if(a.nu ==b.nu )
	return a.t >b.t ;
	else return a.nu <b.nu ; 

int main()

	int n;
	cin>>n;
	for(int i=1;i<=n;i++)	cin>>a[i];
	minn1[1]=a[1];
	maxx1[1]=a[1];
	minn2[n-1]=a[n];
	maxx2[n-1]=a[n];
	for(int i=2;i<=n;i++)
	
		maxx1[i]=maxx1[i-1];
		minn1[i]=minn1[i-1];
		if(a[i]<minn1[i])	minn1[i]=a[i]; 
		if(a[i]>maxx1[i])	maxx1[i]=a[i];
	
	for(int i=n-2;i>=1;i--)
	
		maxx2[i]=maxx2[i+1];
		minn2[i]=minn2[i+1];
		if(a[i+1]<minn2[i])	minn2[i]=a[i+1]; 
		if(a[i+1]>maxx2[i])	maxx2[i]=a[i+1];
	
	cout<<"1.00 ";
	for(int i=1;i<n;i++)
	
		ans[1].t=1-minn1[i]/minn2[i];
		ans[2].t=1-maxx1[i]/maxx2[i];
		ans[3].t=0;
		double t; 
		if(ans[1].t>=0&&ans[1].t<=1)		ans[1].nu=max(maxx1[i],(1-ans[1].t)*maxx2[i])-min(minn1[i],(1-ans[1].t)*minn2[i]);
		else ans[1].nu=0xffffffff-1;
		if(ans[2].t>=0&&ans[2].t<=1)		ans[2].nu=max(maxx1[i],(1-ans[2].t)*maxx2[i])-min(minn1[i],(1-ans[2].t)*minn2[i]);
		else ans[2].nu=0xffffffff;
		ans[3].nu=max(maxx1[i],maxx2[i])-min(minn1[i],minn2[i]);
		sort(ans+1,ans+4,cmp);
		printf("%.10f ", ans[1].t );
	

以上是关于寒假一期训练2 gym103483的主要内容,如果未能解决你的问题,请参考以下文章

寒假训练计划

Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)

第一期寒假学习总结

(寒假开黑gym)2018 USP Try-outs

Gym .101879 USP Try-outs (寒假自训第七场)

Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)