3303: 排水系统
时间限制: 1 Sec 内存限制: 128 MB
提交: 34 解决: 12
[提交][状态][讨论版][命题人:acm4302]
题目描述
有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
来源
分析:题目意思稍微有点绕,思路就是先排序,然后堵当前排水量最大的一个,每次计算S1的值,满足条件则输出。
由于是求至少堵多少个,所以不用考虑太多。
AC代码:
/*第一次写代码时出了些问题,耍了小聪明AC过了,还以为测试数据问题
最后和学长讨论发现我排序时没有去除第一个水管,尴尬!*/
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 100000
int s[maxn+10];
int vis[maxn+10];
int cnt,S=0,x;
inline void fx(int n,int a) {
S=0;
for(int i=0; i<n; i++) {
if(!vis[i]) {
S+=s[i];
}
}
if(S>0)
{
x=(s[0]*a)/S;
}
}
bool cmp(int a,int b) {
return a>b;
}
int main() {
int n,a,b;
cin>>n>>a>>b;
for(int i=0; i<n; i++) {
cin>>s[i];
}
memset(vis,0,sizeof(vis));
fx(n,a);
//cout<<"S"<<S<<endl<<"X"<<x<<endl;
sort(s+1,s+n,cmp);
for(int i=0; i<n; i++) {
if(x>=b) {
cout<<i;
break;
}
vis[i+1]=1;
fx(n,a);
// cout<<"S"<<S<<endl<<"X"<<x<<endl;
}
return 0;
}
教训:不要轻易怀疑测试数据,多想想自己代码有没有漏洞!