排水系统
时间: 1ms 内存:128M
描述:
有n个出水口,第i个出水口的出水量为si,在入水口加入A的水量,问你至少堵掉多少出水口才能使第一个水管出水量至少为B。出水量计算公式(s1*A)/S,S表示未堵掉出水口出水量之和。
输入:
第一行包含三个数 n A B 含义题目中已给出 (1<=n<=100000, 1<=B<=A<=10000)
第二行为n个数字 s1,s2,s3...sn (1<=si<=10000) 代表出水口大小
输出:
至少堵住多少出水口,可以使得第一个水管出水量至少为B。
示例输入:
4 10 3
2 2 2 2
示例输出:
1
提示:
参考答案(内存最优[1508]):
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a,b,s[100005],sum;
int main()
{
int i;
scanf("%d%d%d",&n,&a,&b);
for(i=1;i<=n;i++)
{
scanf("%d",&s[i]);
sum+=s[i];
}
if(n<=1)
{
printf("0\n");
return 0;
}
sort(s+2,s+n+1);
if(s[1]*a/sum>=b)
{
printf("0\n");
return 0;
}
int y=0;
for(i=n;i>1;i--)
{
sum-=s[i];
y++;
if(s[1]*a/sum>=b)
{
break;
}
}
printf("%d\n",y);
return 0;
}
参考答案(时间最优[7]):
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
int s[maxn];
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
ios::sync_with_stdio(0),cin.tie(0);
int n,A,B;
cin>>n>>A>>B;
int sum=0;
rep(i,1,n) {
cin>>s[i];
sum+=s[i];
}
sort(s+2,s+n+1);
int nape=0,t=n;
int i;
for(i=1;i<n;i++)
{
nape+=s[t];
t--;
if((s[1]*A)/(sum-nape)>=B)
break;
}
if((s[1]*A)/sum>=B)
i=0;
cout<<i<<endl;
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。