12月30号,我们迎来了迎2018普及元旦‘欢乐’赛以下是题解:
第一题:
1.myc的IQ
(iq.pas/c/cpp)
【问题描述】
N年后,myc已经是世界某权威学会的会长,他发现自从学信息学竞赛以来,他的智商也在飞速增加,于是他利用大数据和人工智能做了一项调查,发现学信息学学生的IQ真的非常高。举个最好的例子,如果我们把学信息学的一些学生调去学数学,那么两个竞赛的学生平均IQ都会提升。现在给出一群数学竞赛全体学生的IQ和信息学竞赛全体学生的IQ,问最多能把几个学信息学的学生调去学数学,而两个竞赛的学生平均IQ都有提升呢?
每次只调一个学生,而且每次调配,两个竞赛的学生平均IQ都要提升。
【输入】
第1行,一个正整数N(N<=100),代表数学竞赛班学生的数目。
第2行,有N个正整数,代表每个数学学生的IQ(1-200之间)。
第3行,一个整数M(M<=100),代表信息学竞赛班学生数目。
第4行,有M个正整数,代表每个信息学竞赛班学生的IQ(1-200之间)。
输入数据保证信息学学生平均IQ高于数学学生。
【输出】
一个正整数,代表能从信息学调去学数学的学生的个数。
【输入输出样例1】
iq.in | iq.out |
3 3 2 3 3 3 2 5 | 1 |
题目自编。
这题的思路是枚举信息的每一个人,看看这个人加入了数学的里面后是不是两个竞赛的平均分都增加了;判断(a1/n<b[i]&&b1/m>b[i]) ,然后把人数-1和+1,直到所有多判断完了累加交换个数。
3.yjh家的树
(eko.pas/c/cpp)
【问题描述】
yjh家有万亩树林,他的好朋友cz需要一些木头,于是yjh指定了N棵树,每棵都有一个整数高度。cz需要的木头的总需要量为M。 现在需要确定一个最大的统一的砍树高度H,如果某棵树的高度大于H,则高出的部分被砍下。使得所有被砍下的木材长度之和达到M(允许稍超过M)。
例如,有4棵树,高度分别是20 15 10 17,需要的木材长度为 7,砍树高度为15时,第1棵树被砍下5,第4棵树被砍下2,得到的总长度为7。如果砍树高度为16时,第1棵树被砍下4,第4棵树被砍下1,则得到的木材数量为5。给定N和M,请你编程帮杨佳涵和陈卓求出砍树的高度 H。
【输入】
第1行:2个整数N和M,N表示树木的数量(1 ≤ N ≤ 1 000 000),M表示需要的木材总长度(1 ≤ M ≤ 2 000 000 000)。
第2行: N个整数表示每棵树的高度,值均不超过1 000 000 000。所有木材高度之和大于M,因此必然有解。
【输出】
第1行:1个整数,表示砍树的最高高度。
【输入输出样例1】
eko.in | eko.out |
| 36 |
这题数据小,暴力就行了;
第一题:
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[1000],b[1000],s=0,a2=0,b2=0,n1=0,m1=0;
double a1=0,b1=0,a3=0,b3=0;
int main()
{
cin>>n; for(int i=1;i<=n;i++) {cin>>a[i]; a1+=a[i];}
cin>>m; for(int i=1;i<=m;i++) {cin>>b[i]; b1+=b[i];}
m1=m;
sort(b+1,b+1+m);
for(int i=1;i<=m1;i++)
if(a1/n<b[i]&&b1/m>b[i])
{
n++; m--; s++;
a1+=b[i]; b1-=b[i];
}
cout<<s<<endl;
return 0;
}
第三题:
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[2000000]={},x=0,s=0,max1=-1000,i,num1=0;
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>x;
if(x>=max1) max1=x;
a[x]+=1;
}
for(i=max1;num1<m;i--)
{
s+=a[i];
num1+=s;
}
cout<<i;
return 0;
}