----------------------------------- -华丽丽的题解分割线------------------------------------------------------
1. 毛烨超的IQ
题目大意:(咳咳,我们可爱的毛毛)给我们两串数列,并保证a数列的平均值比b数列的平均值大,让我们求有几个数从a数列丢到b数列时,可以使a数列与b数列的平均值都上升。
不可信的样例君:
不可信.in | 不可信.out |
3 3 2 3 3 3 2 5 | 1 |
做法分析:就是求平均值啊。。。。。笔算都能算。。。。。按照道理来说。。。。。是一定要A的题啊(然而我没A,30分。。心情咸鱼)
咳咳,日常附代码:
#include<bits/stdc++.h>
using namespace std;
int a[1000]={},b[1000]={};
int main()
{
intn,m,s=0,k=0,t1=0,t2=0;
doublesa=0,sb=0;
cin>>m;
for(inti=1;i<=m;i++)
{
cin>>b[i];
t2+=b[i];
}
sb=t2*1.0/(m*1.0);//*1.0是为了
cin>>n;
for(inti=1;i<=n;i++)
{
cin>>a[i];
t1+=a[i];
}
sa=t1*1.0/(n*1.0);
for(inti=1;i<=n;i++)
{
if(a[i]<t1*1.0/double((n-k)*1.0)&&a[i]>t2*1.0/double((m+k)*1.0))
{
k++;
t1-=a[i];
t2+=a[i];
s++;
}
}
cout<<s;
return 0;
}
(送分题已过,下一题下一题)
2.黄旭彬家的工厂
题目大意:有n个部件需要在A、B机器上加工,每个工件都必须经过先A后B两道工序。已知:部件i在A、B机器上的加工时间分别为ai,bi。求最短加工时间。
【输入输出样例】
prod.in | prod.out |
5 3 5 8 7 10 6 2 1 4 9 | 34 |
解题思路:很明显,这是一道贪心题。那么解体的重点就是贪心标准了。因为每个工件一定要先A后B,所以我们想要最短就应该让在A处加工越短的越先做,且A和B两道工序要尽量同时在运作,那么贪心标准就出来了。
代码如下:
#include<bits/stdc++.h>
usingnamespace std;
structad
{
int x,y;
}m[1010];
bool cmp(ad p,ad q)
{
return p.x<q.x;
}
int main()
{
int n,sum=0,l,r,la;
int a[1010],b[1010],f[1010];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=n;i++)
{
if(a[i]<b[i]) m[i].x=a[i];else m[i].x=b[i];
m[i].y=i;
}
sort(m+1,m+n+1,cmp);
l=1;r=n;
for(int i=1;i<=n;i++)
if(m[i].x==a[m[i].y]) f[l++]=m[i].y;else f[r--]=m[i].y;
la=0;
for(int i=1;i<=n;i++)
{
if(la>a[f[i]]) la=la-a[f[i]];else la=0;
la+=b[f[i]];
sum+=a[f[i]];
}
cout<<sum+la;
return0;
}
3.杨佳涵家的树
题目大意:有N个棵数,需要总长度为M的木材。你只能选定一个高度横的砍一刀,问选多高能满足M这个长度(允许超出一点)。
数据范围:(1 ≤ M ≤ 2 000 000 000),(1 ≤ N ≤ 1 000 000)
【输入输出样例1】
eko.in | eko.out |
5 20 4 42 40 26 46
| 36 |
(输入保证所有树总长的和大于M,因此一定有解)
解题思路:这道题的数据这么大,很明显是在考我们二分(但M还不够大,可以水过去,但这种行为是要rp--的),那么难点就在允许超出一点这个条件上。我们可以这样想:保证有解,那么当二分完后如果没找到解,那么right这个指针是否是大于M,且离M最近的呢?答案是肯定的。那么就好办了,下面给出代码
#include<bits/stdc++.h>
usingnamespace std
;
int a
[1000100]={};
intmain()
{
int
n
,m
,maxx
=0,l
,r
,mid
;
cin
>>n
>>m
;
for(int
i
=1;i
<=n
;i
++)
{
cin
>>a
[i
];
if(
a
[i
]>maxx
)maxx
=a
[i
];
}
l
=1;r
=maxx
;
while(true)
{
int
s
=0;
mid
=(l
+r
)/2;
for(int
i
=1;i
<=n
;i
++)
{
if(
a
[i
]>mid
)
s
=s
+a
[i
]-mid
;
if(
s
>m
)
{
l
=mid
+1;
break;
}
}
if(
s
<m
)
{
r
=mid
-1;
continue;
}
if(
s
==m
)
{
cout
<<mid
;
return0;
}
if(
l
>=r
)
{
cout
<<r
;
return0;
}
}
return0;
}