ICPC2014 Domestic 参加記
5月某日
ICPCのチームはぼっちです
— しっく (@everysick) May 21, 2014
ICPCチーム誘われないかな感をこんなにも醸し出してるのに一切話が来ない
— しっく (@everysick) May 22, 2014
とか嘆いていたら
@everysick チームまだ決まってないならうちんとこ入らん?(あと1人決まってない)
— ねぎ (@negi_magnet) May 24, 2014
やったね!
というわけで7/11 16:30-19:30に開催されたICPC国内予選に参加してきました。
チームメンバーは
@negi_magnet さん(高専編入, B3)
@shimauma_zzz さん(高専編入, B3)
と私。
まとめ
Aを自分が通す。
このとき"各商品について消費税を計算する"ってのを見逃してて答えがズレたときは焦った
Bを@negi_magnetさんが通す。
途中バグあったので、Dの実装と平行してやる。
Cを@shimauma_zzzさんが「バグがああ」と叫んでました。
Dを自分が通す。
全列挙だったので、時間どれくらいかかるか不安でしたが案外すぐでてきた。
Cの解法を見直し、@negi_magnetさんのアイデアでにぶたんによる実装へ変更することに。
@shimauma_zzzさんが実装している間、残った二人でE,Fの解法模索。
Eの解法を思いついた。
Cのバグが取れなかったので、Eの実装と平行して行うことに。
Eもバグる(迫真)
終わってから気づいたんですが、Eはそもそも解法合ってたのかわからないです。要検証
残り30分くらいになって、 CとEを入れ替えながらデバッグ。
しかし、結局デバッグは終わらず予選終了。
結果は3完50位
○○-○---
反省
AとDもうすこし早解きできればなと思いました。
問題の誤読とか、実装の曖昧さとかがあったので結構時間がかかってしまいました。
Cについては初見で「ウッ幾何だ」ってなってしまったの良くなかった。
解法をあんまり理解できてなかったので、デバッグに協力し切れなかった。
Eは、アレでよかったのかなぁ・・・。
来年への課題(実装力と思考力)が大量にできたので、頑張ろう。
University Tsukuba
今年度うちから出たチーム(5チーム)は全て50位以上に入っていました(祝)
最下位はうちのチームでしたが、TOPは3位に入り、もう1チームが国内突破していました!
おめでた。
来年へ向けて
やっぱり年齢差があるとつらいですね・・・。
固定した面々でチームを組んで、毎年ICPCに挑みたいと思っていましたが、どうも辛そうです。
今年チームを一緒させてもらった先輩方はB3で、短くてあと2年で卒業ですからね。
今からチーム固定は厳しいので、来年くらいまではサークルの先輩方にお世話になるかもしれません。
いつかメンバーを決めたいなぁ・・・。
駆け出しでも良いので、チーム組みたい!って人いたら声かけてください:;(∩´﹏`∩);:
あとは精進をします。来年までの目標は
・今まで解いた問題にプラスしてあと1000問以上解く
・Topcoderの色を黄色く安定させる(現状Div2)
頑張るぞー!!!!
SRM 626 div2
250
class SumOfPower { public: int findSum( vector <int> array ) { vi v(array); int sum = 0; for(int i=1;i<=v.size();i++){ for(int k=0;k<v.size();k++){ if(k+i > v.size())continue; for(int j=k;j<k+i;j++){ sum += v[j]; } } } DUMP(sum); return sum; } };
500
class FixedDiceGameDiv2 { public: double getExpectation( int a, int b ) { int sums = 0; for(int i=1;i<=a;i++){ for(int j=1;j<=b;j++){ if(i>j)sums++; else break; } } double ret = 0; for(int i=1;i<=a;i++){ int cnt = 0; for(int j=1;j<=b;j++){ if(i>j)cnt++; else break; } ret += (double)i * ((double)cnt/(double)sums); } return ret; } };
1000
long long dp[1002][50]; int d[51][51]; class NegativeGraphDiv2 { public: long long findMin( int N, vector <int> s, vector <int> t, vector <int> weight, int charges ) { for(int i=0;i<1000;i++){ for(int j=0;j<50;j++){ dp[i][j] = INF; } } for(int i=0;i<50;i++){ d[i][i] = 0; for(int j=0;j<50;j++){ if(i!=j)d[i][j] = INF; } } for(int i=0;i<s.size();i++){ s[i]--;t[i]--; if(s[i]!=t[i])d[s[i]][t[i]] = weight[i]; } for(int k=0;k<50;k++){ for(int i=0;i<50;i++){ for(int j=0;j<50;j++){ d[i][j] = min(d[i][j], d[i][k] + d[k][j]); } } } for(int i=0;i<N;i++)dp[0][i] = d[0][i]; for(int k=1;k<=charges;k++){ for(int i=0;i<s.size();i++){ dp[k][t[i]] = min(dp[k][t[i]], dp[k-1][s[i]] - weight[i]); } } long long ans = INF; for(int i=0;i<=charges;i++)ans = min(ans, dp[i][N-1]); return ans; } };
Competition
easy若干読めなかった。
midは期待値求めるの時間かかった。
結果:○○-
Practice
hardを解いた。
解法
- easy
特に必要無いよね
- mid
これも・・・必要ないよね。
- hard
Warshall-Floydでchargesが0の場合を求めてから
chargesを使った場合に関してDP。
Warshall-Floydを使わない場合はDPにNのループが付随するらしい。
まぁでも、これのほうが早いと思います。
hard、div1だと行列累乗じゃないと解けないって聞いたけど、まださっぱりわからん。
AOJ 2200 Mr. Rito Post Office
解法
動的計画法
dp[i][j] : i番目まで集配するとき、船をjに泊めていた場合にかかる最小のコスト
陸と海の距離に関してはWarshall-Floydで求めた。
ただ、Dijkstraでもできるらしい(知らん)
コード
//-------------include #include<cstdio> #include<string> #include<iostream> #include<cstring> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include<cmath> #include<cstdlib> #include<climits> #include<vector> #include<list> #include<deque> #include<functional> #include<sstream> //-------------define #define ALL(a) (a).begin(),(a).end() #define PB push_back #define MP make_pair #define SORT(c) sort((c).begin(),(c).end()) #define DUMP(x) cerr << #x << " = " << (x) << endl; #define CLR(a) memset((a), 0 ,sizeof(a)) #define rep(i,n) for(int i=0;i<(int)n;i++) #define fi first #define se second #define INF 1 << 28 //-------------namespace using namespace std; //-------------inline inline int toInt(string s) {int v; istringstream sin(s);sin>>v;return v;} template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();} //-------------typedef typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<string> vs; typedef pair<int, int> pii; //-------------var int dx[]={0,-1,0,1,1,1,-1,-1}; int dy[]={1,0,-1,0,1,-1,1,-1}; int l[201][201]; int s[201][201]; int dp[1001][201]; int main() { int n,m; while(cin >> n >> m,n){ for(int i=0;i<200;i++){ s[i][i] = l[i][i] = 0; for(int j=0;j<200;j++){ if(i!=j)s[i][j] = l[i][j] = INF; } } for(int i=0;i<1000;i++){ for(int j=0;j<200;j++){ dp[i][j] = INF; } } for(int i=0;i<m;i++){ int a,b,t; char p; cin >> a >> b >> t >> p; a--;b--; if(p=='S'){ s[a][b] = s[b][a] = t; }else{ l[a][b] = l[b][a] = t; } } for(int k=0;k<n;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ s[i][j] = min(s[i][j], s[i][k] + s[k][j]); l[i][j] = min(l[i][j], l[i][k] + l[k][j]); } } } int r; cin >> r; vi v(r); for(int i=0;i<r;i++){ cin >> v[i]; v[i]--; } dp[0][v[0]] = 0; for(int i=1;i<r;i++){ for(int j=0;j<n;j++){ for(int k=0;k<n;k++){ dp[i][k] = min(dp[i][k], dp[i-1][j] + l[v[i-1]][j] + s[j][k] + l[k][v[i]]); } dp[i][j] = min(dp[i][j], dp[i-1][j] + l[v[i-1]][v[i]]); } } int ans = INF; for(int i=0;i<n;i++){ ans = min(ans, dp[r-1][i]); } cout << ans << endl; } return 0; }