Cats and Fish HihoCoder - 1631
There are many homeless cats in PKU campus. They are all happy because the students in the cat club of PKU take good care of them. Li lei is one of the members of the cat club. He loves those cats very much. Last week, he won a scholarship and he wanted to share his pleasure with cats. So he bought some really tasty fish to feed them, and watched them eating with great pleasure. At the same time, he found an interesting question:
There are m fish and n cats, and it takes ci minutes for the ith cat to eat out one fish. A cat starts to eat another fish (if it can get one) immediately after it has finished one fish. A cat never shares its fish with other cats. When there are not enough fish left, the cat which eats quicker has higher priority to get a fish than the cat which eats slower. All cats start eating at the same time. Li Lei wanted to know, after x minutes, how many fish would be left.
Input
There are no more than 20 test cases.
For each test case:
The first line contains 3 integers: above mentioned m, n and x (0 < m <= 5000, 1 <= n <= 100, 0 <= x <= 1000).
The second line contains n integers c1,c2 … cn, ci means that it takes the ith cat ci minutes to eat out a fish ( 1<= ci <= 2000).
Output
For each test case, print 2 integers p and q, meaning that there are p complete fish(whole fish) and q incomplete fish left after x minutes.
Sample Input
2 1 1
1
8 3 5
1 3 4
4 5 1
5 4 3 2 1
Sample Output
1 0
0 1
0 3
题意:
给你m条鱼,有n只猫,每只猫吃鱼的速度不同,问x秒后有多少鱼是没被吃的,有多少是没吃完的,吃的快的优先吃鱼
思路:
因为是吃的快的优先吃鱼,那么先将吃鱼的时间从大到小排个序,优先判断吃的快的,猫的速度为ai,那么只有当时间是ai的倍数的时候他才能完整的吃掉一条鱼,这时候我们可以用一个数组b来记录他的状态,这样最后可以通过直接便利b数组来求出有多少鱼没有被完整吃完
当时间i%ai=0的时候代表已经吃完一条鱼,此时将状态标记一下bi=0,表示这只猫空闲,现在就要再给他一条鱼,所以鱼的剩余数量cnt–(完整的鱼的剩余数量实际就是第一个答案)
否则状态bi为1代表正在吃
当没有鱼的时候就可以退出了。
有多少鱼还没吃完即正在吃,遍历b数组可得到第二个答案
code:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m,x,a[1009],b[1009];
while(scanf("%d%d%d",&m,&n,&x) != EOF){
memset(b,0,sizeof(b));
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int cnt = m;//剩余的完整的鱼
for(int i = 1; i <= x; i++){
for(int j = 1; j <= n; j++){
if(b[j] == 0) cnt--;//如果此时猫的状态为空闲就分给他一条鱼,总条数减一
if(i % a[j] == 0) b[j] = 0;//吃完鱼标记为空闲
else b[j] = 1;//正在吃鱼
if(cnt == 0) break;
}
if(cnt == 0) break;
}
int ans = 0;//正在被吃的鱼条数
for(int i = 1; i <= n; i++){
if(b[i] == 1) ans++;
}
printf("%d %d\n",cnt,ans);
}
return 0;
}