24h購物| | PChome| 登入
2011-06-21 09:51:03| 人氣1,006| 回應0 | 上一篇 | 下一篇

d816. 不要再晃啦!

推薦 0 收藏 0 轉貼0 訂閱站台

內容 :

21XX年,還沒滅亡的人類發明出一種超高科技的交通工具,至於是多高的科技呢?這已經超出題目的範圍了,因此忽略。
為什麼要稱它為交通工具呢?因為它是交通用的工具……其實是因為它的形體太過詭異,現代(201X年)科技根本難以形容,不過這種交通工具擁有輪胎,而且還分有前輪後輪,所以可以把它當成車(現代觀點)來看待。

這種車型交通工具有幾個特性:
1.輪子非常微小(奈米科技)。
2.前後輪的間隔正好等於交通工具的長度
3.底盤非常的平整也非常的
根據以上兩點真正的超高科技設計,幾乎沒有地形可以困住它,也因此全世界各大客運都將舊式長方體笨重公車淘汰,改採用這種交通工具。
至於輪胎是怎麼接在車子上的,這點不用擔心,每個輪胎與底盤間都有根長度相同的桿子連接著。我知道這很難想像,畢竟是未來人超高科技之作。
不過這種設計只有唯一的一個缺點,那就是避震效果很糟。


* 以上都不是問題所在,接下來才真正要進入正題 *


相馬櫻久子是一個聰明且認真的高中女生。某天放學,她到了城市中最高的建築──公車站,這個時代的公車站有個特性,就是和公車一樣長度。而這只是題外話,相馬櫻久子搭上了她要坐的車,準備返家。
公車出發沒多久,認真的她就從包包中拿出作業來寫,一開始路面平穩,寫起作業來格外舒暢。
直到某次的劇烈晃動害得她的書上被畫出長長一痕後,她知道現在已經開到路面最顛簸的一段路了。
之後,公車的劇烈晃動使得她無法好好專心。
公車的路徑是條直線,她想知道公車從某一站開始出發,直到下一站而停下來的總路徑上,公車會怎麼搖晃,而很湊巧,她的手邊正好有一張她所搭乘的公車路徑的地形圖。

她只要知道某個時間公車相對於地平線的斜率(還是先假設地球是平的吧),就能推算出公車會怎麼搖晃,因此她必須先計算出每秒鐘公車相對於地平線的斜率才行。
不過她現在必須專心唸書,好打敗她的宿敵結城水貶,根本沒有多餘的心思去計算這麼複雜的東西。
這時,正好上車,會讀心術的立即發覺她的困擾,並且坐到她旁邊的空位上,不知動機為何的決定幫她寫出一個程式來解決這個艱難的問題。

(所有的長度單位都是公尺。)
(公車的水平速度保持一定,且每秒固定會往水平方向行進一公尺。)

輸入說明 :

輸入有多組測資,每組測資共有兩行。
第一行有兩個正整數 n, m (n <= 20, n < m <= 1000), n 代表前後輪的間隔, m 代表公車從某一站出發到下一站停止期間,公車所經過的水平路徑長度。
第二行有 m 個正整數 Ai (Ai <= 100), A1 表示某站起點的海拔高度(公尺), A2 表示某站起點出發後水平距離一公尺的海拔高度…… Am 表示下一站終點的海拔高度。
測資保證每個位置公車底盤與地平面的夾角小於45度。

輸出說明 :

對於每組輸入,輸出從某站起點出發到下一站終點的過程中,每秒鐘公車的底盤相對於地平線的斜率,小數點以下無條件進位到個位數,並且取絕對值。 

範例輸入 :

1 3
1 1 1

範例輸出 :

0 0

提示 :

不必擔心公車會被凸起路面給卡住,至於為什麼就不用多說了吧。
你可以假設相鄰兩點的路面是以平直直線連接。
對了,最好先看清楚說明,不然絕對會連第一筆測資都過不了。

(只要看懂題目,根本秒殺)

測資可能有誤,歡迎指教。
至於題意敘述不清……只能先說抱歉了,逐漸修正中。

 2010/10/22 感謝pcsh710742發現測資錯誤!測資加大並修正測資錯誤。

 2010/11/03 測資範圍大幅縮小了……重測TLE的程式碼。

出處 :

專出Trash Problem (管理:as89366)



作法 : 題目過長,真是一時抓不到重點
簡單的說,就是求斜率,而且無須浮點數
優化一 : 輸入優化
優化二 : 輸出優化

/**********************************************************************************/

/*  Problem: d816 "不要再晃啦!" from 專出Trash Problem                   */
/*  Language: C                                                                   */
/*  Result: AC (88ms, 258KB) on ZeroJudge                                         */
/*  Author: morris1028 at 2011-06-20 18:52:20                                     */
/**********************************************************************************/


#include<stdio.h>
int Input() { 
    char cha; 
    unsigned int x = 0; 
    while(cha = getchar()) 
        if(cha != ' ' && cha != '\n' || cha == EOF) break; 
    if(cha == EOF) return EOF;
    x = cha-48; 
    while(cha = getchar()) { 
        if(cha == ' ' || cha == '\n') break; 
        x = x*10 + cha-48; 
    } 
    return x; 
}
main() {
    int n, m, A[1001], a, b, temp, stp;
    char str[10001];
    while(scanf("%d %d", &n, &m) == 2) {
        for(a = 0, stp = 0; a < n; a++)
            A[a] = Input();
        for(b = 0; a < m; a++, b++) {
            A[a] = Input();
            temp = A[b] - A[a];
            if(temp < 0) temp = -temp;
            temp = temp / n + (temp%n != 0);
            if(temp < 100 && temp > 9)
                str[stp++] = temp/10 + '0', str[stp++] = temp%10 + '0';
            else if(temp < 10)
                str[stp++] = temp +'0';
            else
                str[stp++] = '1', str[stp++] = '0', str[stp++] = '0';
            str[stp++] = ' ';
        }
        str[stp] = '\0';
        puts(str);
    }
    return 0;
}

/**********************************************************************************/
/*  Problem: d816 "不要再晃啦!" from 專出Trash Problem                   */
/*  Language: C                                                                   */
/*  Result: AC (264ms, 280KB) on ZeroJudge                                        */
/*  Author: morris1028 at 2011-06-20 18:29:04                                     */
/**********************************************************************************/


#include<stdio.h>
int Input() {  
    char cha;  
    unsigned int x = 0;  
    while(cha = getchar())  
        if(cha != ' ' && cha != '\n' || cha == EOF) break;  
    if(cha == EOF) return EOF;
    x = cha-48;  
    while(cha = getchar()) {  
        if(cha == ' ' || cha == '\n') break;  
        x = x*10 + cha-48;  
    }  
    return x;  
}
main() {
    int n, m, A[1001], a, b, temp;
    while(scanf("%d %d", &n, &m) == 2) {
        for(a = 0; a < n; a++)
            A[a] = Input();
        for(b = 0; a < m; a++, b++) {
            A[a] = Input();
            temp = A[b] - A[a];
            if(temp < 0) temp = -temp;
            temp = temp / n + (temp%n != 0);
            printf("%d ", temp);
        }
        puts("");
    }
    return 0;
}

台長: Morris
人氣(1,006) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:d017. AB Circle
此分類上一篇:[JAVA] a010. 因數分解

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文