uva 10273(模拟)
题意:有若干个牛每个牛有一个序列每一天这头牛产奶d%tn单位(d当前天数,tn为序列长度)每天产奶最少的会被吃掉,如果有多头产奶一样少则什么也不吃。问最后会留下多少头牛,最后一头被吃掉的牛是在哪一天。
思路:水题。纯模拟每天更新牛的产奶数量,然后把它去掉。若是天数超多lcm(1-10)则不会再有牛吃了。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <utility> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #define ll long long 11 #define INF 0x7fffffff 12 #define eps 1E-6 13 #define LEN 1010 14 #define pb(a) push_back(a) 15 16 using namespace std; 17 18 int n, num[LEN]; 19 vector<int> milk[LEN]; 20 21 int main() 22 { 23 // freopen("in.txt", "r", stdin); 24 25 int T; 26 scanf("%d", &T); 27 while(T--){ 28 scanf("%d", &n); 29 for(int i=0; i<LEN; i++)milk[i].clear(); 30 for(int i=0; i<n; i++){ 31 scanf("%d", &num[i]); 32 for(int j=0; j<num[i]; j++){ 33 int v; 34 scanf("%d", &v); 35 milk[i].pb(v); 36 } 37 } 38 int loc = -1, cnt = n, dm[LEN], vis[LEN]; 39 memset(vis, 0, sizeof vis); 40 memset(dm, 0, sizeof dm); 41 for(int d=0; ;d++){ 42 if(d-loc>700 || cnt==0)break; 43 int Minpos = -1, Min = INF; 44 for(int i=0; i<n; i++){ 45 if(vis[i])continue; 46 dm[i] = milk[i][d%num[i]]; 47 if(Min==dm[i])Minpos = -1; 48 if(Min>dm[i]){ 49 Min = dm[i]; 50 Minpos = i; 51 } 52 } 53 if(Minpos!=-1){ 54 vis[Minpos] = 1; 55 loc = d; 56 cnt--; 57 } 58 } 59 printf("%d %d\n", cnt, loc+1); 60 } 61 return 0; 62 }
奔跑吧!少年!趁着你还年轻