UVA-12108 Extraordinarily Tired Students

啊,题也是很长很长的,让我怀疑这个ACM是不是也顺带着考英语阅读。

不过题意比较简单,就是课上有n(n<=10)个学生,每个人都有个清醒-睡眠周期,每个人都是先清醒A分钟,然后睡B分钟,然后重复(1<=A,B<=5),初始有个状态,说明这个学生处在他的周期的第C分钟。然后每个学生临睡前,要看看睡觉的人是不是严格大于清醒的人,要不就继续清醒A分钟,再检查这个条件。问经过多久,所有人都清醒,当然也可能不存在这个时间,就输出-1.

貌似还有个例子,

这个是样例

3 2 4 1 1 5 2 1 4 3

最后输出18.嗯,其他的自己感悟就好了。说一说坑点,其实没什么坑点,但是我一遇到时间类的模拟就容易懵逼,不知道该把什么时候算成一段时间的开始,本来是用数轴上的点来判断睡觉的情况,但是发现窝草好难,极限懵逼了,然后就改成用区间来表示一段时间了,果然变得有点简单了。主要思路就是用loc表示每个学生在他的区间所处的位置,如果超过了就取余,保证在这个区间内,就好了。然后就对睡觉的人数和这个学生的位置判断然后修改就行了。

#include<iostream>
using namespace std;

struct student {
	int wake;
	int sleep;
	int loc;
} stu[10];

int main() {
	int n;
	int index=1;
	while(cin>>n) {
		if(n==0) break;
		int start[10];
		int sleep=0;
		for(int i=0; i<n; i++) {
			cin>>stu[i].wake>>stu[i].sleep>>stu[i].loc;
			stu[i].loc--;
			start[i]=stu[i].loc;
			if(stu[i].loc>stu[i].wake-1)
				sleep++;
		}
		long long time=0;
		while(++time) {
			bool flag=0;
			//如果睡觉的的人多
			if(sleep>n-sleep) flag=1;
			for(int i=0; i<n; i++) {
				//同时处于马上要睡着的人,这时就睡着
				//注意这里要判断是不是第一次,要是第一次就不进行计算 
				if(flag && time!=1) {
					if(stu[i].loc==stu[i].wake)
						sleep++;
					if(stu[i].loc==0)
						sleep--;
				} else if(time!=1) {
					if(stu[i].loc==stu[i].wake)
						stu[i].loc=0;
					else if(stu[i].loc==0)
						sleep--;
				}
			}
			bool flag2=1;
			if(time==1) flag2=0;
			for(int i=0; i<n; i++) {
				//判断是否与开始时的状态相同 
				if(stu[i].loc!=start[i]) flag2=0;
				//然后对每个同学所处的位置自增 
				stu[i].loc++;
				//不过要保证在这个区间内 
				stu[i].loc%=(stu[i].sleep+stu[i].wake);
			}
			if(sleep==0)
				break;
			if(flag2) {
				//cout<<time<<endl;
				time=-1;
				break;
			}
			//cout<<"sleep:"<<sleep<<endl;
		}
		cout<<"Case "<<index++<<": "<<time<<endl;
	}
	return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专知

关关的刷题日记07——Leetcode 26. Remove Duplicates from Sorted Array 方法1

关小刷刷题07 – Leetcode 26. Remove Duplicates from Sorted Array 方法1 题目 Given a sorted...

30540
来自专栏数据结构与算法

P1372 又是毕业季I

题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌。1000多个日夜的欢笑...

32940
来自专栏计算机视觉与深度学习基础

主席树POJ2104

求区间第k大数是多少 用我惯用的线段树写法似乎不适合写主席树,看别人的代码好半天才看懂 用root表示每一个前缀树的根,思想大致是由第i-1个树构成的树建第i个...

27690
来自专栏同步博客

工厂模式

  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

12720
来自专栏一个会写诗的程序员的博客

编程范式 (Programming paradigm)

范,模范、典范也。范式即模式、方法。常见的编程范式有:函数式编程、程序编程、面向对象编程、指令式编程等。

38310
来自专栏企鹅号快讯

编程世界的沟沟坎坎

我相信每一个想学习编程或者经历过编程实践的人,在刚开始的时候都会遇到一些沟沟坎坎,尤其是对编程里面的一些概念,比如说Java语言是面向对象的、C语言是面向过程的...

24190
来自专栏斑斓

迪米特法则与重构

在面向对象设计的世界里,有一个寻常却又常常为人所忽略的原则——“迪米特(Law of Demeter)”法则。这个原则认为,任何一个对象或者方法,它应该只能调用...

12360
来自专栏数据结构与算法

1095 火星人

1095 火星人 2004年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 D...

368100
来自专栏Python小屋

Python实现大自然数分解为最多4个平方数之和(1)

问题描述:任意大自然数,总是能分解为最多4个平方数的和,所谓平方数是指它是一个自然数的平方。例如:72884 = 4^2 + 138^2 + 232^2,337...

28840
来自专栏ACM算法日常

CodeForces 982F:The Meeting Place Cannot Be Changed(有向图)

Petr is a detective in Braginsk. Somebody stole a huge amount of money from a ba...

10510

扫码关注云+社区

领取腾讯云代金券