ACM/ICPCに参加することになったぽいので問題をみんなで解いた結果とか、有用なサイトとかの情報を書いていきましょう。
2006A by ゆん 所要時間35分程度。forのあたりが汚い罠。
解法: 数列の最初から順番に素数かどうかを判定し数えていく。
#include <stdio.h> #include <math.h> int isPrime(int n) { if(n == 1) return 0; for(int i = 2; i <= sqrt(n); ++i) { if (n % i == 0) return 0; } return 1; } int main() { int a, d, n; while(1) { scanf("%d %d %d ", &a, &d, &n); if(a == 0 && d == 0 && n== 0) return 0; int t; for(int i = 0, p = 0; p != n; t = a + d * i, p += isPrime(t), ++i) {} printf("%d\n", t); } }
2005A by ゆん所要時間60分程度。ファイル入出力を思い出すのに時間がかかった。
解法: 単利と複利の計算、単純。
#include <stdio.h> #include<algorithm> int simple(int initial, int years, double rate, int aoc){ int sum = 0; for(int i = 0; i < years; ++i){ sum += (int)(initial * rate); initial -= aoc; } return initial + sum; } int compound(int initial, int years, double rate, int aoc) { for(int i = 0; i < years; ++i){ initial += (int)(initial * rate); initial -= aoc; } return initial; } int main() { int datasets; scanf("%d", &datasets); for(int i = 0; i < datasets; i++){ int initial, years , ops; scanf("%d%d%d", &initial, &years, &ops); int max = 0; for(int j = 0; j < ops; j++) { int x, z; double y; scanf("%d%lf%d", &x, &y, &z); int tmax = x ? compound(initial, years, y, z) : simple(initial, years, y, z); max = std::max(max, tmax); } printf("%d\n", max); } return 0; }
解法: 日付を配列の添え字に利用して、人数を数える。
#include <stdio.h> int main() { int convenient[101]; int N, Q; while(1) { scanf("%d%d", &N, &Q); if(N == 0 && Q == 0) return 0; for(int i = 0; i < 101; ++i){ convenient[i] = 0; } for(int i = 0; i < N; ++i){ int M; scanf("%d", &M); for(int j = 0; j < M; ++j){ int d; scanf("%d", &d); convenient[d] += 1; } } for(int i = 0, max = 0, q = 0; i < 101; ++i){ if(convenient[i] >= Q) { if(q < convenient[i]) { q = convenient[i]; max = i; } } if(i == 100) { printf("%d\n", max); } } } }