杭电ACM题1006

2024-05-12 02:58
文章标签 杭电 acm 1006

本文主要是介绍杭电ACM题1006,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

杭电题1006

Tick and Tick

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16425    Accepted Submission(s): 3970


Problem Description
The three hands of the clock are rotating every second and meeting each other many times everyday. Finally, they get bored of this and each of them would like to stay away from the other two. A hand is happy if it is at least D degrees from any of the rest. You are to calculate how much time in a day that all the hands are happy.

Input
The input contains many test cases. Each of them has a single line with a real number D between 0 and 120, inclusively. The input is terminated with a D of -1.

Output
For each D, print in a single line the percentage of time in a day that all of the hands are happy, accurate up to 3 decimal places.

Sample Input
  
0 120 90 -1

Sample Output
  
100.000 0.000 6.251

三针Happy,即三针两两Happy。所以这个问题可以转化成求两针Happy的时间。

这道题只要利用角速度来进行求解,然后配合周期进行运算

秒针,每分钟转动360度;

分针,每小时转动360度,每分钟转360/60=6度;

时针,一个小时转30度,那么每分钟转30/60=0.5度;

角速度比=》时针:分针:秒针=0.5:6:30=1/120:0.1:6

现在定义

V_SEC 6 秒针角速度;

V_MIN 0.1 分针角速度;

V_HOU 1/120 时针角速度

设当前的时间为H:M:S,其中0<=H<12,0<=M<60,0<=S<60,H,M皆为整数,S为实数,于是时针、分针、秒针相对于时刻0:0:0的转角分别为

A_SEC 6S  这是因为秒针,要站在秒针的角度思考问题,60秒转360度,那么每秒转6度,故S秒会转6S;

A_MIN 6M+0.1S  这是因为分针,要站在分针的角度考虑问题,60分钟转360度,每分钟转6度  故6M

                             1分钟转6度即60秒钟转6度,那么每秒分针转0.1度  故0.1S

A_HOU 30H+0.5M+S/120  同理可知啊;

设题目中的临界夹角为D,则“快乐时光”是同时满足以下不等式的解:

D<=|A_HOU - A_MIN|<=360-D;  (1)

D<=|A_HOU - A_SEC|<=360-D;  (2)

D<=|A_MIN - A_SEC|<=360-D;  (3)

唉。。。。。。这个真心不会做,接着分析吧

上面的绝对值中的形式一定可以化为bS-a,(a,b为常数),故:

D<=bS-a<=360-D  解得[(a+D)/b,(a+360-D)/b]

D-360<=bS-a<=-D 解得[(a+D-360)/b,(a-D)/b]

故解的形式为:[(a+D)/b,(a+360-D)/b]并上[(a+D-360)/b,(a-D)/b]即两个闭区间的并集。

设由式(1)得到的解集为S11并S12,那么“快乐时光”在时、分确定的情况下,其秒的解集为

[0,60]交(S11并S12)交(S21并S22)交(S31并S32)

上面的集合容易化成S1并S2并S3并S4并S5并S6并S7并S8的形式,其中S1,S2,...皆为闭区间。

求区间的并的总长度没有困难,而这个总长度就是由时、分确定的“快乐时光”的长度。

A_HOU - A_MIN=30H+0.5M+S/120-(6M+0.1S)=(30H-5.5M)-(11S/120)=a-bS

A_HOU - A_SEC=(30H+0.5M+S/120)-6S=(30H+0.5M)-(719S/120)=a-bS

A_MIN - A_SEC=6M+0.1S-(6S)=(6M)-5.9S=a-bS

于是代码很明朗了。

#include "iostream"
#include <iomanip>
using namespace std ;
struct Segment//区间结构
{double a,b;
};
//由两个区间求出它们的交区间
Segment operator *(Segment S1,Segment S2){Segment seg;seg.a=S1.a>S2.a?S1.a:S2.a;seg.b=S1.b<S2.b?S1.b:S2.b;if (seg.a>seg.b)seg.a=seg.b=0.0;return seg;}
//“快乐时光”临界角度
double D;
//从D<=bS-a<=D1 中解出区间
Segment makeSeg1(double,double);
//从D<=a-bS<=D1
Segment makeSeg2(double,double);int main(){  while (cin>>D,D!=-1){double toLen=0.0;//“快乐时光”总长度//枚举时、分for (int H = 0; H < 12; H++){for (int M = 0; M < 60; M++){Segment S[3][2];//获得基本解区间double a,b;a=30.0*H-5.5*M;b=11.0/120;//时针-分针S[0][0]=makeSeg1(a,b);S[0][1]=makeSeg2(a,b);a=30.0*H+0.5*M;b=719.0/120;//秒针-时针S[1][0]=makeSeg1(a,b);S[1][1]=makeSeg2(a,b);a=6.0*M;b=5.9;//秒针-分针S[2][0]=makeSeg1(a,b);S[2][1]=makeSeg2(a,b);//将解集转化为区间的并,并累计“快乐时光”的长度for (int i = 0; i < 2; i++)for (int j = 0; j < 2; j++)for (int k = 0; k < 2; k++){Segment TS=S[0][i]*S[1][j]*S[2][k];toLen+=TS.b-TS.a;}}}cout<<setprecision(3)<<fixed<< toLen / 432.0 <<endl;}system("pause");return 0;  }  
//从D<=bS-a<=D1中解出
Segment makeSeg1(double a,double b){Segment seg;seg.a=(D+a)/b,seg.b=(360.0-D+a)/b;if (seg.a<0.0) seg.a=0.0;if (seg.b>60.0)seg.b=60.0;if (seg.a>=seg.b)seg.a=seg.b=0.0;return seg;
}
//从D<=a-bS<=D1中解出区间
Segment makeSeg2(double a,double b){Segment seg;seg.a=(a+D-360.0)/b,seg.b=(a-D)/b;if (seg.a<0.0)seg.a=0.0;if (seg.b>60.0)seg.b=60.0;if (seg.a>=seg.b)seg.a=seg.b=0.0;return seg;
}

参考大神网址为:

http://blog.csdn.net/gubojun123/article/details/8604163

http://blog.sina.com.cn/s/blog_69fc13c50100l89a.html






这篇关于杭电ACM题1006的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981412

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些

【UVa】10600 ACM Contest and Blackout 次小生成树

类型:次小生成树 题目大意: 为了举办ACM竞赛,市长决定给所有的n(3 <= n <= 100)所学校提供可靠的电力供应。当且仅当一个学校直接连到电站,或者连到另一个有可靠供应的学校时,才有可靠供应。现在给出在不同学校之间的布线成本,找出最便宜的两种连线方案。一个方案的成本等于其中所有学校之间连线的成本的总和。 题目分析: 次小生成树。 先求出最小生成树,然后枚举所有不在

2024杭电8

1004.cats 的重力拼图 题意: 有一个n*m的矩阵,给出最开始拼图的位置。 可以有四个选择,设置重力的方向,就是拼图会向一个方向竖直掉落到最底。 问任意操作次数后拼图走过的方格数量最大值。 题解: 首先已经在边缘的拼图,只能沿着边走一圈,再判断最开始可以朝哪个方向移动是最大值。 代码: #include<bits/stdc++.h>using namespace s

acm 学习总结

最近也是新做了几个题目有的通过看题解然后自己敲出来一遍一遍的修改对动态规划也是有了点认识在拿到一个题目考虑他的思路时如果没法找到每个子问题之间的关系并且用数组将他们记忆就说明这个思路是错的而且题目有很多都是根据一个知识点不断的变式。每种类型的题也都有模板最近我在专门看这些模板,模板看的我也是一脸懵,其实我觉得模板这东西说好也好说不好也不好,好的时候你看出来哪种题适合哪种模板套进去题目就ac了,但是