SRM540 Div2
Easy(122.18/250)
条件を注意して読みましょう。最初からちゃんと読んでいれば、余裕で240点代出せます。
バグ対策[要出典]にソートした人はあまりいなさそうでした。
#include <algorithm> #include <cmath> #include <ctime> #include <iostream> #include <string> #include <vector> using namespace std; class RandomColoringDiv2{ public: int getCount(int maxR, int maxG, int maxB, int R, int G, int B, int d1, int d2) { int ans = 0; for(int i = 0; i < maxR; i++){ for(int j = 0; j < maxG; j++){ for(int k = 0; k < maxB; k++){ int a[3]; a[0] = abs(i-R); a[1] = abs(j-G); a[2] = abs(k-B); sort(a,a+3); if(d1<=a[2]&&a[2]<=d2)ans++; } } } return ans; } };
Medium(0/500)
色々面倒な問題。550でいいと思います。
まず、初項を1と仮定する。
初項がk増えるときに、k増える項とk減る項がある('+'のとき、左の項と逆で、'-'のとき、同じ。)から、両方ともすべて正の整数になるようなkの個数を求めれば良い。
#include <algorithm> #include <cmath> #include <ctime> #include <iostream> #include <string> #include <vector> using namespace std; typedef long long ll; ll num[51];//本番ではintにしてた。 class ImportantSequence{ public: int getCount(vector <int> B, string op) { int len = B.size(); for(int i = 0; i <= len; i++){ if(i==len)return -1; if(op[i]!='-')break; } num[0] = 1; for(int j = 0; j < len; j++){ if(op[j]=='+'){ num[j+1] = B[j]-num[j]; }else{ num[j+1] = -B[j]+num[j]; } } int f = 1; ll plus = 1,minus = 1000000000000LL;//本番では10^9にしてた。たぶん for(int i = 0; i < len; i++){ if(op[i]=='+'){ f = !f; } if(f){ plus = min(plus,num[i+1]); }else{ minus = min(minus,num[i+1]); } } if(plus<=0) minus += plus-1; return minus>0?minus:0;//本番ではreturn minus;にしてた(plusを足す前に負になるパターンは除いていた) } };
Hard(Opened/1000)
Score 122.18
Rating 1192 -> 1126