AOJ1179 Millennium問題について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
joergi

AOJ1179 Millennium問題について

#1

投稿記事 by joergi » 13年前

現在こちらのサイト(http://www.cs.titech.ac.jp/icpc2012/icp ... ll_en.html)のAに取り組んでいるのですが、表示が以下のようになります。括弧内の本来ならば出力されるべきとその横の数値のずれを書き足しました。数値のずれが小さいし、ものによっては合っているものもありどこが間違っているのかわかりません。アドバイスよろしくお願いします。

8
1 1 1
196470(196470) 合ってる
344 3 1
128974(128976) -2
696 5 1
59710(59710) 合ってる
182 9 5
160712(160715) -3
998 8 7
251(252) -1
344 2 19
128975(128977) -2
696 4 19
59712(59712) 合ってる
999 10 20
3(1) +2

コード:

#include <stdio.h>

int main(void){
    int i=0,n,y,m,d; //n=データセット数, y=year, m=month, d=day
    scanf("%d",&n);  //データセット数を入力
    while(i < n){  //データセット数の数だけループ
        scanf("%d%d%d",&y,&m,&d);

        int j=1,k=1;
        int d_sum=d;  //日の合計
        int m_sum=10*(y-1)+m;  //月の合計

        //日数の合計値を計算
        while(j < y){  //年の数だけループを回す
            while(k < m_sum){  //月の数だけループを回す
                if(j%3==0 || k%2==1){  //3で割れる年か2で割れない(大の月)月
                    d_sum += 20;
                }else{
                    d_sum += 19;
                }
                k++;
                if(k%11==0) break;
            }
            j++;
        }
        printf("%d\n",196471-d_sum);
        i++;
    }   
    return 0;
}

box
記事: 2002
登録日時: 15年前

Re: AOJ1179 Millennium問題について

#2

投稿記事 by box » 13年前

joergi さんが書きました: 999 10 20
これの意味が、カレンダーか何かの999年10月20日ということであるならば、
その日は998年と「9ヶ月」と20日目なので、
joergi さんが書きました:

コード:

        int m_sum=10*(y-1)+m;  //月の合計
ここを何とかしないとまずいような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

joergi

Re: AOJ1179 Millennium問題について

#3

投稿記事 by joergi » 13年前

こちらが日本語ページです。
http://www.cs.titech.ac.jp/icpc2012/icp ... ll_ja.html

返信ありがとうございます。
問題は日数合計値を計算しているところだと思っていたのでそちらにも目を向けて改善していきます。

かずま

Re: AOJ1179 Millennium問題について

#4

投稿記事 by かずま » 13年前

joergi さんが書きました:

コード:

                if(k%11==0) break;
 
これだと、1年が 11か月です。
年と月の二重ループはやめて、月だけのループにし、
if (k%10 == 1) j++;
にすると解決するはずです。

joergi

Re: AOJ1179 Millennium問題について

#5

投稿記事 by joergi » 13年前

できました!!

本当にどうもありがとうございます!!!m(__)m

かずま

Re: AOJ1179 Millennium問題について

#6

投稿記事 by かずま » 13年前

月のループもなくせます。
規則的なものだから、四則演算だけで計算可能です。

コード:

#include <stdio.h>
 
int main(void)
{
    int n, y, m, d;
    scanf("%d", &n);
    while (--n >= 0) { 
        scanf("%d%d%d", &y, &m, &d);
        if (y % 3) d -= (m-1)/2;
        d += (20+19)*5*(y-1) + (y-1)/3 *5 + 20*(m-1);
        printf("%d\n", 196471 - d);
    }       
    return 0;
}

かずま

Re: AOJ1179 Millennium問題について

#7

投稿記事 by かずま » 13年前

かずま さんが書きました:月のループもなくせます。
規則的なものだから、四則演算だけで計算可能です。

コード:

        if (y % 3) d -= (m-1)/2;
よく見たら、if も % も -= も四則演算ではありませんね。
とにかくループなしに書けるということを言いたかったわけです。

どうしても四則演算だけで書け、と言われたら、

コード:

 printf("%d\n", 196471-(20+19)*5*(y-1)-(y-1)/3*5-20*(m-1)+(y-y/3*3)/2*(m-1)/2-d);

かずま

Re: AOJ1179 Millennium問題について

#8

投稿記事 by かずま » 13年前

かずま さんが書きました:

コード:

 printf("%d\n", 196471-(20+19)*5*(y-1)-(y-1)/3*5-20*(m-1)+(y-y/3*3)/2*(m-1)/2-d);
(y-y/3*3) は間違いで、(y-y/3*3+1) でした。 ということで、プログラムは

コード:

#include <stdio.h>

int main(void)
{
    int n, y, m, d;
    for (scanf("%d", &n); n && scanf("%d%d%d", &y, &m, &d); n--)
         printf("%d\n",
            196471-195*(y-1)-(y-1)/3*5-20*(m-1)+(y-y/3*3+1)/2*(m-1)/2-d);
    return 0;
}

閉鎖

“C言語何でも質問掲示板” へ戻る