寒假一期训练2 gym103483
Posted yeah17981
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了寒假一期训练2 gym103483相关的知识,希望对你有一定的参考价值。
给n天,每天想考试的人数和每天能考的人数,求学生移动次数最小值
题解:二分w,第i天的学生只能从i移到i-w到i之间的任意位置,求出ans
(可能也许这么做的,发现队友补了就摸了)
给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自训第一场)