2015-10-17 23 views
3

如果您在給定時間啓動12小時模擬時鐘,並在另一個給定時間停止,則分針會超過時針的次數?帶時鐘的任務 - 算法

或多或少我知道該怎麼做,但那些特殊情況是什麼?

我有這樣的事情:

#include<cstdio> 
#include<cmath> 

int main() 
{ 
int t,h1,m1,i,h2,m2,count,j,j1,j2; 
scanf("%d",&t); 
while(t--) 
{ 
scanf("%d:%d",&h1,&m1); 
scanf("%d:%d",&h2,&m2); 
if(h1==0 && m1==0) 
    m1+=1; 
count=0; 
if(h1==h2) 
{ 
    if(h1>=12) 
     j=(60*(h1-12))/11; 
    else 
     j=(60*h1)/11; 
    if(j>=m1 && j<m2) 
    count++; 
} 
else 
{ 
    for(i=h1+1;i<h2;i++) 
    { 
    if(i!=11 && i!=23) 
    count++; 
    } 

    if(h1>=12) 
     j1=(60*(h1-12))/11; 
    else 
     j1=(60*h1)/11; 
    if(j1>=m1 && j1<=59) 
    count++; 

    if(h2>=12) 
     j2=(60*(h2-12))/11; 
    else 
     j2=(60*h2)/11; 
    if(j2<m2 && j2<=59) 
    count++; 
} 
printf("%d\n",count); 
} 
return 0; 
} 

但是,我的代碼,一些測試會返回一個壞的結果:(

例如:

22:00 02:00

我的代碼應該返回3,但它返回18

+0

能否請您提供您的問題更多的細節?我不明白你在問什麼。什麼是「小費」? 「一直持續到特定時間」是什麼意思?你指的是什麼「特例」? – user3553031

+0

這個想法是計算從00:00到我們指定的小時的分鐘數覆蓋的小時數 – xaxa

+0

我仍然不明白你在說什麼。 「封面小貼士」是什麼意思? – user3553031

回答

0

交叉點將發生t:12:00,01:05,02:10,03:16,04:21,05:27,06:32,07:38,08:43,9:49,10:54

我認爲一個更好的方法是統計時間表是否相交。在對算法進行計數後,首先對輸入數據進行規範化處理。否則,你應該深入研究幾何和數學,以解決方程中的問題。

計數的方法會導致類似的優化算法,因爲您的最大範圍不超過24小時,對每個輸入都有一個恆定的時間。

如果你不想使用這種方法,那麼通過檢查T1的約束是否總是小於T2,你的代碼會更好。例如:

int H1, M1, H2, M2; 
double vd, vm, ratio, t, t1, t2, spot; 
char smiec; 

while (cin >> H1 >> smiec >>M1 >> H2 >> smiec >> M2) 
{ 
    ratio = 720/11; 

    t1 = H1 * 60 + M1; 
    t2 = H2 * 60 + M2; 

    if (t2 < t1) 
     t2 += 24 * 60; 

    t = t2 - t1; 

    spot = floor(abs(t/ratio)); 

    cout << spot << endl; 
} 
+0

不完全。如果我們從00:00開始,那麼在分針回到頂端時,時針將在01:00。分鐘還需要5分鐘才能到達01:00,在這段時間內,時針會移動。你可以通過求解一個遞歸函數得到正確的答案 - 或者你可以將12小時除以11. – user3553031

+0

所以,不是,爲什麼?因爲,1:05後用鉤子順時針覆蓋 – xaxa

+0

你說得對。但我建議的算法的主要問題是,它應該規範輸入數據。 22:00到2:00的例子,它的計算絕對差異,這是10小時而不是4,因爲人們會直覺地回答。 –

1

下面是用分針和時針之間的角速度的差別一種算法:

#include <iostream> 
#include <cmath> 
using namespace std; 

int main(){ 
    int H1, M1, H2, M2, answer; 
    double time1, time2; 
    char smiec; 

    while (cin >> H1 >> smiec >> M1 >> H2 >> smiec >> M2){ 
    H2 = H2 < H1 ? H2 + 24 : H2; 

    time1 = H1 + M1/60.0; 

    time2 = H2 + M2/60.0; 

    answer = floor(11/12.0 * time2) - floor(11/12.0 * time1); 

    cout << answer << endl; 
    } 
} 
+0

我想這個版本計算出正確的結果,如果是這樣,它是如何工作的?另外,請說明OP代碼中的問題,以及這個版本如何修復它(如果可能的話)。 – anatolyg

+0

不使用'bits/stdC++。h'](http://stackoverflow.com/q/31816095/509868),特別是在一個教學示例中。 – anatolyg

+0

@anatolyg謝謝您的意見。我知道noth關於C++,所以我不得不查看你的評論意味着什麼。我更新的答案是否有助於您更好地理解? –