UVA 10273 Eat or not to Eat?

直接暴力模拟 。以每次还未被删除的cnt[i]为一周期进行暴力模拟

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);}
int lcm(int a, int b) {if (a < b) swap(a,b);int tmp = gcd(a,b); return a / tmp * b;}
#define MAXN 1010
int N;
int cnt[MAXN];
int src[MAXN][20];
bool killed[MAXN];
int kill(int day)
{
    int ans = 300,num = 0,st;
    for (int i = 1; i <= N; i++)
      if (!killed[i])
      {
          int val = src[i][day % cnt[i]];
          if (val == ans) num++;
          if (val < ans)
          {
              ans = val;
              st = i;
              num = 1;
          }
      }
    if (num == 1) return st;
    return 0;
}
int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d",&N);
        for (int i = 1; i <= N; i++)
        {
            scanf("%d",&cnt[i]);
            for (int j = 1; j < cnt[i]; j++)
                scanf("%d",&src[i][j]);
            scanf("%d",&src[i][0]);
        }
        memset(killed,false,sizeof(killed));
        int tot = 0, st = 1, ed,ans = 0;
        while (true)
        {
            bool flag = false;
            int tmp = 1;
            for (int i = 1; i <= N; i++)
               if (!killed[i]) tmp = lcm(tmp,cnt[i]);
            ed = st + tmp - 1;
            for (int i = st; i <= ed; i++)
            {
                int k = kill(i);
                if (k)
                {
                    killed[k] = true;
                    //printf("%d %d\n",k,i);
                    tot ++;
                    ans = i;
                    flag = true;
                }
            }
            st = ed + 1;
            if (!flag || tot >= N) break;
        }
        printf("%d %d\n",N - tot,ans);
    }
    return 0;
}
时间: 2024-12-31 19:02:07

UVA 10273 Eat or not to Eat?的相关文章

UVA10273 - Eat or Not to Eat?(暴力)

题目链接 题目大意:一个农场的主人为了改善收入决定每天要将产量最少的那一头牛杀掉,但是如果这一天出现了多只产量最小的牛,那么这一天一头也不杀.然后给你n头牛,给你每头牛的产量周期和周期内的产量,问多少天后可以确定剩余的牛的情况. 解题思路:求出这n头牛的周期的最小公倍数,那么在这个周期内,如果没有牛被杀的话,那么之后的情况是循环的,不会再有牛被杀了,这样情况就确定下来了.在这样的条件下,暴力就不会超时. 代码: #include <cstdio> #include <cstring>

函数的链式调用实现Man().sleep().eat()

let index = 0; let stack = []; function next() { let fn = stack[index]; index++; if(typeof fn === 'function'){ fn(); } } function fn1() { console.log(1) next() } function fn2() { setTimeout(function() { console.log(2) next() },0) } function fn3() { c

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

N-gram统计语言模型(总结)

N-gram统计语言模型 1.统计语言模型 自然语言从它产生開始,逐渐演变成一种上下文相关的信息表达和传递的方式.因此让计算机处理自然语言.一个主要的问题就是为自然语言这样的上下文相关特性建立数学模型. 这个数学模型就是自然语言处理中常说的统计语言模型,它是今天全部自然语言处理的基础,而且广泛应用与机器翻译.语音识别.印刷体和手写体识别.拼写纠错.汉字输入和文献查询. 2.N-Gram N-Gram是大词汇连续语音识别中经常使用的一种语言模型.对中文而言,我们称之为汉语语言模型(CLM, Chi

Python学习--第七周

本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 #_*_coding:utf-8_*_ 2 3 4 class A: 5 def __init__(self): 6 self.n = 'A' 7 8 class B(A): 9 # def __init__(self): 1

JavaSE入门学习21:Java面向对象之接口(interface)(二)

一接口实现的多态 在上一篇博文:JavaSE入门学习20:Java面向对象之接口(interface)(一)中提到了接口的实现存在多态性,那么 这一篇主要就要分析接口实现的多态. 实例一 Test.java源文件代码: public class Test{ public static void main(String[] args){ //实现接口Singer Singer s1 = new Student("Amy"); s1.sing(); s1.sleep(); s1.study

从n-gram中文文本纠错到中文语法纠错以及同义词聚类

前记 本文简单地讲解如何使用n-gram模型结合汉字拼音来作中文错别字纠错,然后介绍最短编辑距离在中文搜索纠错方面的应用:最后从依赖树入手讲解如何作文本长距离纠错(语法纠错),并从该方法中得到一种启示,利用依赖树的特点结合ESA算法来做同义词的聚类. n-gram模型 在中文错别字查错情景中,我们判断一个句子是否合法可以通过计算它的概率来得到,假设一个句子S = {w1, w2, ..., wn},则问题可以转换成如下形式: P(S)被称为语言模型,即用来计算一个句子合法概率的模型. 但是使用上

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

python并发编程之---协程

1.什么是协程 协程:是单线程下的并发,又称微线程,纤程. 协程是一种用户态的轻量级线程,协程是由用户程序自己控制调度的. 2.需要注意的点: 需要强调的是: #1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) #2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点