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 を復習すること
引き続き、のんびり精進します。