链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网题目描述
大马猴和机智羊打算参加运动会的两人三足项目(两个人并排跑,中间两条腿绑在一起),为此,机智羊甚至学会了站立走路ヾ(≧▽≦*)o,为了备战比赛,他们预计要做一些默契度训练。
大马猴正常走路每走一步的距离为 x,机智羊每走一步的距离为 y。但在两人三足项目中,他们每走一步的距离必须一样。
如果大马猴花了 a1天去调整,他可以将步长改为 x-1∼x+1中任何一个数;如果他花了a1+a2天去调整,那么他可以将步长改为 x-2∼x+2中任何一个数.即如果大马猴花费a1+a2+a3+…+an天,则他可以把走一步的距离改为 x-n∼x+n中任何一个数;同理,机智羊花费b1+b2+b3+...+bm天,则他可以把走一步的距离改为 y-m∼y+m中任何一个数。注意,ai,bi可能为负数,即如果只想改距离3,可能a1+a2+a3+a4+a5 会比a1+a2+a3更优。
大马猴最多只能改n步,机智羊最多只能改m步,因为他俩的腿长是有限的。注意不能多轮调整,调整到的步长必须是正整数。
请问至少需要多少天,才能让他俩走一步的距离一样。数据保证一定有解,且最优解一定大于0。
输入描述:
第一行,包含四个正整数 xxx,yyy,nnn,mmm,具体含义如题面所示。 第二行,包含 nnn 个整数 aia_iai。 第三行,包含 mmm 个整数 bib_ibi。
输出描述:
一行一个整数,表示至少需要多少天。
示例1
输入
6 3 2 2 2 2 1 -1
输出
2
说明
最优解为两个人调整步距为 555 : 大马猴需要改变 111 格距离,需要 222 天; 机智羊需要改变 222 格距离,需要 1+(−1)=01+(-1)=01+(−1)=0 天, 所以至少需要 222 天。
示例2
输入
8 2 5 4 1 1 2 2 2 2 5 3 2
输出
7
说明
最优解为两个人调整步距为4: 大马猴需要改变4格距离,需要1+1+2+2=6天; 机智羊需要改变2格距离,需要2+5=7天,所以至少需要7天 (大马猴最后1天不用做调整,这一天浪费掉)。
备注:
【数据范围】 对于 50%50\%50% 的测试点,1≤x,y≤10001 \le x,y \le 10001≤x,y≤1000,1≤n,m≤10001 \le n,m \le 10001≤n,m≤1000,−1000≤ai-1000 \le a_i−1000≤ai,bi≤1000b_i \le 1000bi≤1000; 对于另外 20%20\%20% 的测试点,1≤x1 \le x1≤x,y≤105y \le 10^5y≤105,1≤n1 \le n1≤n,m≤105m \le 10^5m≤105,0≤ai0 \le a_i0≤ai,bi≤104b_i \le 10^4bi≤104; 对于 100%100\%100% 的测试点,1≤x1 \le x1≤x,y≤105y \le 10^5y≤105,1≤n1 \le n1≤n,m≤105m \le 10^5m≤105,−104≤ai-10^4 \le a_i−104≤ai,bi≤104b_i \le 10^4bi≤104。
#include<stdio.h>
int main(){
int x,y,n,m,i,k,min=99999999;
scanf("%d%d%d%d",&x,&y,&n,&m);
int a[n+1],b[m+1],z=(x-y>0?x-y:y-x);
for(i=1,a[0]=0;i<=n;i++){
scanf("%d",&a[i]);
a[i]=a[i]+a[i-1];
}
for(i=1,b[0]=0;i<=m;i++){
scanf("%d",&b[i]);
b[i]=b[i]+b[i-1];
}
for(i=n-1;i>0;i--)
if(a[i]>a[i+1]) a[i]=a[i+1];
for(i=m-1;i>0;i--)
if(b[i]>b[i+1]) b[i]=b[i+1];
for(k=(z<n?z:n);k>=0&&z-k<=m;k--)
if(min>(a[k]>b[z-k]?a[k]:b[z-k])) min=(a[k]>b[z-k]?a[k]:b[z-k]);
printf("%d",min);
return 0;
}