SRM481
- SRM481
Result
250: Passed System Test
500: Compiled
900: Failed System Test
レーティング下がったね。
Code
250
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> #include<complex> using namespace std; class CircleMarket { public: int makePurchases(vector <int> openTime, vector <int> closeTime, int travelTime) { int ret = 0; int now = 0; int tmax = 0; bool vis[101]={false,}; for(int i = 0; i < closeTime.size(); ++i){ tmax = max( tmax, closeTime[i] ); } for(int i = 0; i < openTime.size(); ++i){ //cout << i << " : " << openTime[i] << ' ' << closeTime[i] << " : "<<vis[i] << endl; if( openTime[i] <= now && now <= closeTime[i] && !vis[i] ){ ++ret; vis[i]=true; now += travelTime; }else{ now += travelTime; } if( now > tmax ) break; if( i == openTime.size() - 1 ) i = -1; if( ret == openTime.size() ) break; } return ret; } };
500
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> #include<complex> using namespace std; class ChickenOracle { public: string theTruth(int n, int eggCount, int lieCount, int liarCount) { int n_know_truth = n - lieCount; int n_donknow_truth = lieCount; int chikCount = n - eggCount; bool ambi=false; string ret = "The oracle is a lie"; // cout <<" FIRST : " <<endl; for(int i = 0; i <= liarCount; ++i){ if( eggCount - i < 0 ) continue; if( chikCount - (liarCount-i) < 0 ) continue; int consider_egg = eggCount - i + (liarCount - i ); int consider_chik = chikCount + i - (liarCount - i ); // cout << " i = " << i << " CEGG : " << consider_egg << " CCHICKEN : " << consider_chik << endl; if( consider_egg < 0 || consider_egg > n || consider_chik < 0 || consider_chik > n ){ continue; } if( n_donknow_truth == n_know_truth && n_know_truth == consider_egg ){ ambi=true; } if( consider_egg == n_know_truth && consider_chik == n_donknow_truth ){ if( ret == "The chicken" ){ambi=true;} else if( true ) ret = "The egg"; }else if( consider_egg == n_donknow_truth && consider_chik == n_know_truth ){ if( ret == "The egg" ){ ambi=true; } else if( true ) ret = "The chicken"; } } // cout <<"SECOND : " << endl; for(int i = 0; i <= liarCount; ++i){ if( eggCount - (liarCount - i ) < 0 ) continue; if( chikCount - i < 0 ) continue; int consider_egg = eggCount + i - (liarCount - i ); int consider_chik = chikCount - i + (liarCount - i ); // cout << " i = " << i << " CEGG : " << consider_egg << " CCHICKEN : " << consider_chik << endl; if( consider_egg < 0 || consider_egg > n || consider_chik < 0 || consider_chik > n ){ continue; } if( n_donknow_truth == n_know_truth && n_know_truth == consider_egg ){ ambi=true; } if( consider_egg == n_know_truth && consider_chik == n_donknow_truth ){ if( ret == "The chicken" ){ambi=true;} else if(true) ret = "The egg"; }else if( consider_egg == n_donknow_truth && consider_chik == n_know_truth ){ if( ret == "The egg" ){ ambi=true; } else if(true) ret = "The chicken"; } } if( ambi ) ret = "Ambiguous"; return ret; } };
むちゃくちゃ汚い。lieCountから、真実を知っている人と知らない人の人数を求めて、それから嘘をついている人間をEgg側にしたりChichken側にしたりしながら、つじつまが合うかどうか判断する(liarCount回ループを回す)。
900
#include<iostream> #include<string> #include<vector> #include<algorithm> #include<set> #include<map> #include<cmath> #include<complex> using namespace std; class BatchSystem { public: class Job{ public: long long int d; string n; int i; bool operator<(const Job &t)const{ if( d==t.d ){if( i==t.i ){return n<t.n;}else return i<t.i;}else return d<t.d; } }; vector <int> schedule(vector <int> dur, vector <string> user) { vector<int> ret(user.size()); vector<long long int> duration(dur.begin(),dur.end()); map<string, vector<int> > result; vector<Job> jobs; for(int i = 0; i < user.size(); ++i){ result[user[i]].push_back( i ); } for(int i = 0; i < user.size(); ++i){ for(int j = i+1; j < user.size(); ++j){ if( i != j ){ if( user[i] == user[j] ){ duration[i] += duration[j]; duration.erase( duration.begin() + j ); user.erase( user.begin() + j ); --i;break; } } } } for(int i = 0; i < duration.size(); ++i){ jobs.push_back(Job()); jobs[i].d = duration[i]; jobs[i].n = user[i]; jobs[i].i = i; } set<Job> sjobs; for(int i = 0; i < jobs.size(); ++i){ sjobs.insert( jobs[i] ); } int n = 0; for(set<Job>::iterator its = sjobs.begin(); its != sjobs.end(); ++its){ //cout << its->n << " duration : " << its->d << " index : " << its->i << endl; //cout << result[its->n].size() << endl; for(int i = 0; i < result[its->n].size(); ++i){ int ind = result[its->n][i]; ret[n++] = ind; } } return ret; } };
同じ人のジョブをまとめてからソートすればいい。
一応これらでPassed System Testとなった。