【FZSZ2017暑假提高组Day2】圆盘时钟
【问题描述】
作为出题人的小Z相信大家对上图这样的圆盘时钟都不会陌生——在理想圆盘时钟上,秒针每一分钟转一圈,分针每一小时转一圈,时针每12小时转一圈,它们均是匀速转动的,在0点时三条针均指向表盘上的12。
考虑圆盘时钟与电子时钟之间的转换,显然,对于任意一个形如 hh:mm:ss的电子时钟式的时间(其中0 <=hh<=11,0<=mm,ss<=59),我们均可以很容易地确定时针分针秒针在理想的圆盘时钟上的位置,并计算出三条针两两之间的夹角(要求均不大于180°)。
小Z以前在Codeforces上看到一种构造题目的方法——把题目反转,于是他想到这么一个问题:如果给定三条针两两之间的夹角,那么是否可以确定当前的时刻,或者判断出有多个时刻符合条件,或者判断出不存在符合条件的时刻?
但是小Z实在太菜了,于是这个问题就被交给你来解决了。
【输入格式】
第一行为一个正整数T,表示数据组数。
接下来T组数据,每组数据一行三个用空格隔开的,形如a/b的最简分数(如果是整数,则b=1),分别表示时针与分针、时针与秒针、分针与秒针之间的夹角的度数。
【输出格式】
每组数据第一行输出一个非负整数n,表示符合条件的时刻个数,接下来n行,按照hh:mm:ss的格式(其中0<=hh<=11,0<=mm,ss<=59)从早到晚输出所有符合条件的时刻。
【样例输入】
5
0/1 0/1 0/1
90/1 90/1 0/1
60/1 60/1 60/1
55/2 5/2 30/1
45/1 135/1 180/1
【样例输出】
1
00:00:00
2
03:00:00
09:00:00
0
2
00:05:00
11:55:00
2
04:30:00
07:30:00
【数据规模与约定】
对于30%的数据,保证答案如果存在,那么mm=ss=0。
对于60%的数据,保证答案如果存在,那么ss=0。
对于100%的数据,1<=T<=500,分数a/b是既约分数,且满足0<=a<=43200,1<=b<=43200,且0<=a/b<=180。
题目分析
我们先分析一下题意:知道夹角求的是时间,我们可以枚举时间然后打表,此举不保证你会爆炸,但保证你会写的很不爽。我们分析一下假设是i时j分k秒,就得到如下关系:
时分 :30(i+j/60+k/3600)-6(j+k/60)=30i-5.5j-11/120k=(x||180-x)
时秒:30(i+j/60+k/3600)-6k=30i-0.5j-719/120k=(y||180-y)
分秒:6(j+k/60)-6k=6j-59/60k=(z||180-z)
这里有点坑啊,一个角度可能是两种情况,组合一下就有8种情况了。我们输入的时候用string分开各个比值,解一下三元一次方程组即可,解线性方程组用高斯消元就可以了。
代码实现
原来我写不出的,在这里感谢我校的大佬陈敬辉,我研究了他的代码,我想问他一句:四百多行的代码,你这是抄谁的?这题一般的省一是绝对不会的。
#include<cstdio>
#include<algorithm>
using namespace std;class fenshu{
private:int fuhao,fenmu,fenzi;
public:void clean(void){fenzi=,fenmu=,fenzi=;}
void prepare(int s,int d,int n){if(!d) return;
fuhao=s,fenzi=n,fenmu=d;
int gcd=__gcd(fenzi,fenmu);
fenzi/=gcd,fenmu/=gcd;
}int FUHAO(){return fuhao;}
int FENZI(){return fenzi;}
int FENMU(){return fenmu;}
void Abs(void){fuhao=;}
fenshu operator+(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=;
fuhao?ans.fenzi+=fenzi*X.fenmu:ans.fenzi-=fenzi*X.fenmu;
X.fuhao?ans.fenzi+=X.fenzi*fenmu:ans.fenzi-=X.fenzi*fenmu;
ans.fuhao=ans.fenzi>=?:;
if(!ans.fuhao) ans.fenzi=-ans.fenzi;
int gcd=__gcd(ans.fenzi,ans.fenmu);
ans.fenzi/=gcd,ans.fenmu/=gcd;
return ans;
}fenshu operator-(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=;
fuhao?ans.fenzi+=fenzi*X.fenmu:ans.fenzi-=fenzi*X.fenmu;
X.fuhao?ans.fenzi-=X.fenzi*fenmu:ans.fenzi+=X.fenzi*fenmu;
ans.fuhao=ans.fenzi>=?:;
if(!ans.fuhao) ans.fenzi=-ans.fenzi;
int gcd=__gcd(ans.fenzi,ans.fenmu);
ans.fenzi/=gcd,ans.fenmu/=gcd;
return ans;
}fenshu operator*(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=fenzi*X.fenzi;
ans.fuhao=fuhao==X.fuhao?:;
if(ans.fenmu<) ans.fenmu=-ans.fenmu;
if(ans.fenzi<) ans.fenzi=-ans.fenzi;
int gcd=__gcd(ans.fenzi,ans.fenmu);
ans.fenzi/=gcd,ans.fenmu/=gcd;
return ans;
}fenshu operator/(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenzi,ans.fenzi=fenzi*X.fenmu;
ans.fuhao=fuhao==X.fuhao?:;
if(ans.fenmu<) ans.fenmu=-ans.fenmu;
if(ans.fenzi<) ans.fenzi=-ans.fenzi;
int gcd=__gcd(ans.fenzi,ans.fenmu);
ans.fenzi/=gcd,ans.fenmu/=gcd;
return ans;
}bool operator==(fenshu X){return fenzi==X.fenzi&&fenmu==X.fenmu;}
bool operator>=(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=;
fuhao?ans.fenzi+=fenzi*X.fenmu:ans.fenzi-=fenzi*X.fenmu;
X.fuhao?ans.fenzi-=X.fenzi*fenmu:ans.fenzi+=X.fenzi*fenmu;
return ans.fenzi>=;
}bool operator <= (fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=;
fuhao?ans.fenzi+=fenzi*X.fenmu:ans.fenzi-=fenzi*X.fenmu;
X.fuhao?ans.fenzi-=X.fenzi*fenmu:ans.fenzi+=X.fenzi*fenmu;
return ans.fenzi<=;
}bool operator>(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=;
fuhao?ans.fenzi+=fenzi*X.fenmu:ans.fenzi-=fenzi*X.fenmu;
X.fuhao?ans.fenzi-=X.fenzi*fenmu:ans.fenzi+=X.fenzi*fenmu;
return ans.fenzi>;
}bool operator<(fenshu X){fenshu ans;
ans.clean(),ans.fenmu=fenmu*X.fenmu,ans.fenzi=;
fuhao?ans.fenzi+=fenzi*X.fenmu:ans.fenzi-=fenzi*X.fenmu;
X.fuhao?ans.fenzi-=X.fenzi*fenmu:ans.fenzi+=X.fenzi*fenmu;
return ans.fenzi<;
}void read(){char s[];scanf("%s",s);int t=;
s[]=='-'?fuhao=,t=:fuhao=,t=;
fenmu=fenzi=;
while(s[t]^'/') fenzi=fenzi*+s[t]-'',++t;
++t;while(s[t]^'\0') fenmu=fenmu*+s[t]-'',++t;
if(!fenmu){clean();return;}
int gcd=__gcd(fenzi,fenmu);
fenzi/=gcd,fenmu/=gcd;}
}hour_minute,hour_second,minute_second,hour_0,minute_0,second_0,l59,step_s,zero,one,full,full6,full12,full30,full60,full3600,temp;
class time{public:int hour,minute,second;
bool operator!=(time x){return hour^x.hour||minute^x.minute||second!=x.second;}
friend bool operator<(time x,time y){
if(x.hour^y.hour) return x.hour<y.hour;
if(x.minute^y.minute) return x.minute<y.minute;
return x.second<y.second;}
}anss[],_anss[];
int _ans,T,ans;
fenshu change(fenshu x){
while(x<zero) x=x+full;
while(x>full) x=x-full;
return x;
}void check(){fenshu minute,hour;
hour_0=change(second_0+hour_second);
if(hour_0==change(minute_0+hour_minute)||hour_0==change(minute_0-hour_minute)){
minute=minute_0;
while(minute>=full6) minute=minute-full6;
minute=minute/full6*full;
if(second_0==minute){
minute=minute_0,minute=minute/full6*full,hour=hour_0;
while(hour>=full30) hour=hour-full30;
hour=hour*full12*full60;
if(hour==minute){anss[ans].hour=;
for(temp=hour_0;temp>=full30;temp=temp-full30,++anss[ans].hour);
anss[ans].minute=;
for(temp=minute_0;temp>=full6;temp=temp-full6,++anss[ans].minute);
anss[ans].second=;
for(temp=second_0;temp>=full6;temp=temp-full6,++anss[ans].second);
++ans;
}}}hour_0=change(second_0-hour_second);
if(hour_0==change(minute_0+hour_minute)||hour_0==change(minute_0-hour_minute)){
minute=minute_0;
while(minute>=full6) minute=minute-full6;
minute=minute/full6*full;
if(second_0==minute){
minute=minute_0,minute=minute/full6*full,hour=hour_0;
while(hour>=full30) hour=hour-full30;
hour=hour*full12*full60;
if(hour==minute){
anss[ans].hour=;
for(temp=hour_0;temp>=full30;temp=temp-full30,++anss[ans].hour);
anss[ans].minute=;
for(temp=minute_0;temp>=full6;temp=temp-full6,++anss[ans].minute);
anss[ans].second=;
for(temp=second_0;temp>=full6;temp=temp-full6,++anss[ans].second);
++ans;
}}}}signed main(){
hour_minute.clean(),hour_second.clean(),minute_second.clean(),hour_0.clean(),minute_0.clean();
second_0.clean(),l59.clean(),l59.prepare(,,),step_s.clean(),step_s.prepare(,,),zero.clean();
one.clean(),full.clean(),full60.clean(),full3600.clean(),temp.clean(),full30.clean(),full6.clean();
full12.clean(),zero.prepare(,,),one.prepare(,,),full.prepare(,,),full60.prepare(,,);
full3600.prepare(,,),full30.prepare(,,),full6.prepare(,,),full12.prepare(,,);
scanf("%d",&T);
fenshu pd;pd.prepare(,,);
while(T--){
hour_minute.read(),hour_second.read(),minute_second.read(),ans=;
for(second_0.prepare(,,);second_0<=l59;second_0=second_0+step_s)
minute_0=change(second_0+minute_second),check(),minute_0=change(second_0-minute_second),check();
sort(anss,anss+ans);
if(ans){_anss[].hour=anss[].hour;
_anss[].minute=anss[].minute;
_anss[].second=anss[].second;_ans=;
for(int i=;i<ans;++i)
if(anss[i]!=anss[i-]){
_anss[_ans].hour=anss[i].hour;
_anss[_ans].minute=anss[i].minute;
_anss[_ans++].second=anss[i].second;
}
}printf("%d\n",_ans);
for(int i=;i<_ans;++i)
printf("%02d:%02d:%02d\n",_anss[i].hour,_anss[i].minute,_anss[i].second);
}
}
代码说明
这篇代码挺长,这道题非常不好写。我的思路可行,正解是直接按照暴力来做,枚举可能出现的点,然后去重。我用了类模板在这里,这个东西可以在我的工程C++中看到,不过我没用自己的定义类,而是类struct的模板。
首先读入数据,这个和快读同理,注意的是\0代表的是空字符,就是空格,换行和制表符。然后我们对可能出现的时间进行变换,怎么做呢?把时间枚举出来,然后变成分数暴力判断,用operator重载。枚举的时候用了倍增的思想。最后输出的时候要排序去重,其实这里本来是重载了unique的,现在它没有了。
今天发生了一些变故,我深深的感到了人心不古。
【FZSZ2017暑假提高组Day2】圆盘时钟的更多相关文章
- 【FZSZ2017暑假提高组Day1】华容道游戏
[问题描述] 华容道是一种有趣的滑块游戏,大概是下面这个样子的. 游戏局面由一个2*2的曹操滑块,五个2*1的蜀将滑块(横竖是不定的).四个1*1的小兵滑块以及两个空的位置构成,玩家需要利用空的位子移 ...
- 【FZSZ2017暑假提高组Day1】确定小组
[问题描述] 有n个人坐成一排,这n个人都在某一个小组中,同一个小组的所有人所坐的位置一定是连续的. 有一个记者在现场进行采访,他每次采访都会询问一个人其所在的小组有多少人,被询问的每个人都给出了正确 ...
- 【FZSZ2017暑假提高组Day1】最大矩形
[问题描述] 现在有n个宽度为1的矩形按如下图(左边的)所示的方式排在了一起: 用肉眼容易看出,在左图内部面积最大的矩形如右图绿色部分所标注. 现在我们考虑将其中一些宽度为1的矩形取出,按照原顺序再次 ...
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
- 2013 Noip提高组 Day2
3288积木大赛 正文 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前 ...
- 暑假提高组集训Day1 T1
说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...
- 【未完成0.0】Noip2012提高组day2 解题报告
第一次写一套题的解题报告,感觉会比较长.(更新中Loading....):) 题目: 第一题:同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一 ...
- HGOI20180813 (NOIP2018 提高组 Day2 模拟试题)
省常中省选提高Day2 继续 第一题就考了贪心,正解95pts的贪心策略第一印象是想到的,但是被自己否定掉了qwq,然后打了 不是正解的贪心,样例5没过(可怜)思路如下:先找出每个门对应可以通过的人数 ...
- NOIP 2015 提高组 Day2
期望得分:100+10+60=170 实际得分:100+10+35=145 http://www.cogs.pro/cogs/page/page.php?aid=16 T1 跳石头 时间限制:1 s ...
随机推荐
- 运维grep语法
grep的语法和用法 grep命令的格式: grep [options] PATTERN [FILE] 其中:1,pattern是用正则表达式书写的模式.2,FILE是要查找的文件,可以是用 ...
- yum 的 group的信息
查找 yum源中有哪些group及其详细信息 1:yum groupinfo '*' | less 2:yum groupinfo '*' | less +/sendmail-cf 将 sendmai ...
- Xcode 和 VisualC++输出流的差别的理解
将这样一段程序分别运行与Visual Studio 和 Xcode上边的结果: #include <iostream> using namespace std; int main() { ...
- SpringCloud分布式配置中心所遇问题
1.如果更换了获取配置文件的名称一定要在客户端配置文件的name更改2.不建议服务器设置下拉到git仓库的配置文件地址,可能导致更换地址之后无法获取到新更改的
- day04列表
列表 内容详细 1.列表 公共 独有方法 删除 remove pop clear del区别 强制转换 #表示多个事物 users=["lili","Joe", ...
- C++学习(三十六)(C语言部分)之 链表2
测试代码笔记如下: #include<stdio.h> #include<stdlib.h> typedef struct node { int data;//数据 struc ...
- django jquery ajax 知识点
示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <div id='d'>1</div> <div> <div id='i1' nam ...
- websocket 心跳重连
websocket 的基本使用: var ws = new WebSocket(url); ws.onclose = function () { //something reconnect(); // ...
- Inotify机制的简单应用
编程之路刚刚开始,错误难免,希望大家能够指出. 一.Inotify机制 1.简单介绍inotify:Inotify可用于检测单个文件,也可以检测整个目录.当检测的对象是一个目录的时候,目录本身和目录里 ...
- devops的理解
DevOps(Development和Operations的组合词)是一种重视"软件开发人员(Dev)"和"IT运维技术人员(Ops)" DevOps是一组过程 ...