AtCoder Beginner Contest 070 by C
AtCoder Beginner Contest 070 について
C言語での回答
今回は調子がいいぞ!
できたもの
A
B
C
できなかったもの
D
問題A
#include <stdio.h> int main(void){ char n[3]; scanf("%s", &n); if(n[0]==n[2]){ printf("Yes"); } else{ printf("No"); } return 0; }
数字って書いてるけど1桁目と3桁目を比較したいんだから文字列として受け取ってやり、
str[0]とstr[2]で比較してやればおしまい。
問題B
#include <stdio.h> int main(void){ int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); if(c>b||d<a){ printf("0"); } else if(a<=c&&b>=d){ printf("%d", d-c); } else if(a<=c&&b<d){ printf("%d", b-c); } else if(a>=c&&b>=d){ printf("%d", d-a); } else if(a>=c&&b<d){ printf("%d", b-a); } return 0; }
分岐条件に注意。cがaより後とは限らないのだ。
bとdの=に関しては逆にしてても同じだと思います。
問題C
#include <stdio.h> long long gcd(long long a, long long b){ if(b==0){ return a; } else{ return gcd(b, a%b); } } long long lcm2(long long a, long long b){ long long d = gcd(a,b); return a/d * b; } int main(void){ int n,i; long long t[101]; scanf("%d", &n); for(i=0;i<n;i++){ scanf("%lld", &t[i]); } long long l = t[0]; for(i=0;i<n-1;i++){ l = lcm2(l,t[i+1]); } printf("%lld", l); return 0; }
最小公倍数を求めればOK
分からなかったのでアルゴリズムを調べました。
こちらのサイトより
https://algo-logic.info/lcm-of-array/
問題D
まだ
途中↓
#include <stdio.h> #define num_max 100010 long long depth[num_max]; typedef struct { int To; long long Cost; }EDGE; EDGE tree[300030]; //頂点vから頂点Kまでの最短距離 void dfs(int v, int p, long long d){ int i; depth[v] = d; for(i=tree[v].To;i!=-1;i++){ //<-forの範囲どうなの? if(tree[i].To==p){ continue; } dfs(tree[i].To, v, d + tree[i].Cost); } } int main(void){ int n,q,k,i; scanf("%d", &n); int a,b; long long c; int x, y; for(i=0;i<n-1;i++){ scanf("%d %d %lld", &a, &b, &c); a--, b--; tree[a].To = b; tree[a].Cost = c; tree[b].To = a; tree[b].Cost = c; } scanf("%d %d", &q, &k); k--; dfs(k, -1, 0); //頂点Kからxまでとyまでの和 for(i=0;i<q;i++){ scanf("%d %d", &x, &y); x--,y--; printf("%lld", depth[x]+depth[y]); } return 0; }
解説:
https://img.atcoder.jp/abc070/editorial.pdf
C++のコードをCに書き換えようとしているところですが、関数のループ条件がわかりません