*ACM/ICPC [#j81a080c] ACM/ICPCに参加することになったぽいので問題をみんなで解いた結果とか、有用なサイトとかの情報を書いていきましょう。 -[[過去問:http://www.acm-japan.org/icpc-j.html]] -[[ACM/ICPC問題用入出力の書き方:http://www.deqnotes.net/acmicpc/input_output]] -[[ACM-ICPC OB/OG の会:http://acm-icpc.aitea.net/index.php?FrontPage]] **結果 [#ga5047ad] ***2010年 [#v9e4fd2b] -[[国内予選の結果(CCS内部)>>10年度-ACM-ICPC国内予選]] -[[国内予選の結果(CCS内部)>10年度-ACM-ICPC国内予選]] ***2008年 [#e2bdb785] -[[国内予選の結果(CCS内部)>08年度-ACM-ICPC国内予選]] ***2007年 [#w752d8f4] -[[国内予選の結果(CCS内部)>07年度-ACM-ICPC国内予選]] -[[ACM-ICPC 国内の参加チーム一覧:http://icpc.baylor.edu/icpc/regionals/RosterPublic.asp?ContestID=881]] ネタですけれども。 by [[ねいむ]] **解答晒し [#r79fc17a] [[2006A:http://www.acm-japan.org/past-icpc/domestic2006/contest/all_ja.html#section_A]] 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); } } [[2006Bの解答]]&br; [[2006Dの解答]]&br; &br; &br; [[2005A:http://www.acm-japan.org/past-icpc/domestic2005/A/A_ja.html]] 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; } [[2005Bの解答]]&br; [[2005Cの解答]]&br; &br; &br; [[2004Aの解答]]&br; [[2004Bの解答]]&br; [[2004Dの解答]]&br; [[2004Eの解答]]&br; &br; &br; [[2003A:http://www.acm-japan.org/past-icpc/domestic2003/A.htm]] by [[ゆん]] 所要時間35から45分。 解法: 日付を配列の添え字に利用して、人数を数える。 #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); } } } }