見出し画像

CF #704 (Div. 2) 参戦記録 p.40

itsukiです。
Codeforces # 704 (Div. 2) に参戦した様子です。解説記事ではありません。

結果は A の1完でした。B は 2回提出しましたが、Time limit exceeded から抜け出せませんでした。
回答時間合計:25分25秒
スコア:460

考察の流れ

A. Three swimmers

3人が泳いでいて、それぞれ a 分毎, b 分毎, c 分毎に左側に戻ってくる
p 分以降 最初に左側に戻ってくる人を待つとき、何分待てばいいかを考える
「 x の倍数のうち、p以上 かつ p に最も近い値 」について、x=a, x=b, x=c それぞれの場合を計算し、最も小さい値が答え
#include <stdio.h>
#include <math.h>
#define MIN(x,y)	((x)<(y)?(x):(y))
#define MIN3(x,y,z)	((x)<(MIN(y,z)) ? (x):(MIN(y,z)))
typedef long long ll;
typedef long double ld;
int main(){
   int t;
   scanf("%d",&t);
   while(t){
       ll i,p,a,b,c,min;
       scanf("%lld%lld%lld%lld",&p,&a,&b,&c);
       min = MIN3( (ll)ceill((ld)p/(ld)a)*a, (ll)ceill((ld)p/(ld)b)*b, (ll)ceill((ld)p/(ld)c)*c );
       printf("%lld\n",min-p);
       t--;
   }
   return 0;
}

B. Card Deck

現在持っているカードのうち、最大値のカード以上(以降)を出力
のようなことを繰り返せば…とコードを書いてみたものの、最後まで Time limit exceeded...

(Time Limit Exceeded)

#include <stdio.h>
int main(){
   int t;
   scanf("%d",&t);
   while(t){
       int i,j,n,p[100005]={0};
       scanf("%d",&n);
       for(i=0; i<n; i++){ scanf("%d",&p[i]); }
       int max, maxi, end=n;
       while( end > 0 ){
           max=0;
           for(i=0; i<end; i++){
               if( p[i] > max ){ max = p[i]; maxi=i; }
           }
           for(j=maxi; j<end; j++){ printf("%d ",p[j]); }
           end = maxi;
       }
       printf("\n");
       t--;
   }
   return 0;
}

まとめ

・「18:05から開始」という超人権こどふぉ、最高です
・1 完だったけど楽しかった
・B を復習すること

引き続き、のんびり精進します。

#備忘録 #参戦記録 #codeforces #プログラミング #競プロ #C言語 #704 #Div2

いいなと思ったら応援しよう!