AtCoder Beginner Contest 057 by C
AtCoder Beginner Contest 057 について
C言語での回答
できたもの
A
B
できなかったもの
C
D
問題A
#include <stdio.h> int main(void){ int a,b; scanf("%d %d", &a, &b); if(a+b<24){ printf("%d\n", a+b); } else{ printf("%d\n", a+b-24); } return 0; }
合計が24以下であればそのまま、24以上であれば-24をすれば24時間表記になります。
問題B
#include <stdio.h> const long long inf = (long long)1 << 60; typedef struct{ int a; int b; }STUDENT; typedef struct{ int c; int d; }POINT; STUDENT stu[51]; POINT point[51]; //絶対値 long long neg(long long nn){ return nn < 0 ? -nn : nn ; } int main(void){ int n,m,i; int check[51]; scanf("%d %d", &n, &m); for(i=0;i<n;i++){ scanf("%d %d", &stu[i].a, &stu[i].b); } for(i=0;i<m;i++){ scanf("%d %d", &point[i].c, &point[i].d); } int j,ians; for(i=0;i<n;i++){ long long min = inf; for(j=0;j<m;j++){ long long cal = neg(stu[i].a-point[j].c)+neg(stu[i].b-point[j].d); if(min>cal){ min = cal; ians = j; } } printf("%d\n", ians+1); } return 0; }
差が負になったときは符号を逆にする関数を作り、あとは問題文中に示されたとおりにマンハッタン距離を計算、最小となるチェックポイントの番号を返します。
配列は0始まりなので出力時は+1を忘れずに。
問題C
#include <stdio.h> int max(int a, int b){ return a > b ? a : b; } int cnt_digits(long long N){ int digits = 0; while(N>0){ N/=10; digits++; } return digits; } int main(void){ long long N,i,j; scanf("%lld", &N); int ans = cnt_digits(N); for(i=1LL;i*i<=N;i++){ if(N%i!=0){ continue; } long long B = N/i; int cur = max(cnt_digits(i),cnt_digits(B)); if(ans>cur){ ans=cur; } } printf("%d\n", ans); return 0; }
Nを割れる数かどうかをチェック。
積の交換法則 A*B = B*AからA*A<=Nを満たすAまで全探索すればいいようです。
最初は素因数分解をすることでABの組み合わせをあげようとしましたが、それこそ10^10まで回す必要と非常に大きな配列が必要なことから無理でどうしたものか悩んでました。
解けなかった原因
10^10に影響されて全探索の可能性を排除していた。
→方針がたたなかった。
問題D
まだ