UVa10273 Eat or Not to Eat?

        题意:N头奶牛,第i头牛产奶有周期Ti,即第d天产量等于第d+Ti天产量。每天主人杀掉产量最少的牛,如果多头产量最少,则不会杀掉。问最后能剩下多少牛,以及最后一次杀牛的天数。

        思路:模拟。如果连续若干天牛不被杀,以后就不会被杀了。那到底是连续多少天呢,直接用1~10的最小公倍数2520。。。


#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <ctype.h>
#define INF 1000000
using namespace std;


int cyc[10010];
int cow[10010][12];
bool eat[10010];

int main(){
	int T;
	cin>>T;
	
	int N;
	while(T--){
		memset(eat,0,sizeof(eat));
		
		cin>>N;
		for(int i=1;i<=N;i++){
			cin>>cyc[i];
			for(int j=0;j<cyc[i];j++){
				cin>>cow[i][j];
			}
		}
		
		int b=0;
		int count=0;
		int last;
		for(int day=1;;day++){
			
			int tmp=INF;
			bool flag=false;
			int k;
			for(int i=1;i<=N;i++){
				if(eat[i])continue;
				if( cow[i][(day-1)%cyc[i]]<tmp ){
					tmp=cow[i][(day-1)%cyc[i]];
					k=i;
					flag=true;
				}else if( cow[i][(day-1)%cyc[i]]==tmp ){
					flag=false;
				}
			}
			if(b>2520)break;
			if(flag){
				b=0;
				eat[k]=true;
				count++;
				last=day;
			}else{
				b++;
			}
		}
		if(count){
			cout<<N-count<<" "<<last<<endl;
		}else{
			cout<<N-count<<" "<<0<<endl;
		}
	}
	return 0;
}


你可能感兴趣的:(模拟,uva)