TopCoder SRM 398 DIV 2 (Practice)
SRM 499前にやった。
250: MinDifference
#include <iostream> #include <sstream> #include <string> #include <vector> using namespace std; class MinDifference { public: int closestElements(int A0, int X, int Y, int M, int n) { vector<int> A(n); A[0] = A0; for(int i = 1; i < n; i++){ A[i] = (A[i - 1] * X + Y) % M; } sort(A.begin(), A.end()); int minimum = INT_MAX; for(int i = 0; i < n - 1; i++){ minimum = min(minimum, A[i + 1] - A[i]); } return minimum; } };
500: CountExpressions
#include <iostream> #include <sstream> #include <string> #include <vector> #include <algorithm> #include <queue> using namespace std; class CountExpressions { public: int calcExpressions(int x, int y, int val) { vector<int> v; v.push_back(x); v.push_back(x); v.push_back(y); v.push_back(y); sort(v.begin(), v.end()); int cnt = 0; do { queue<pair<int, int> > q; q.push(make_pair(v[0], 0)); while(!q.empty()){ pair<int, int> t = q.front(); q.pop(); if(t.second >= 3){ if(t.first == val) cnt++; continue; } int s; s = t.first + v[t.second + 1]; q.push(make_pair(s, t.second + 1)); /*if(*/(s = t.first - v[t.second + 1]);/*>= 0)*/ q.push(make_pair(s, t.second + 1)); /*if(*/(s = t.first * v[t.second + 1]);/* >= 0)*/ q.push(make_pair(s, t.second + 1)); } } while(next_permutation(v.begin(), v.end())); return cnt; } };
900:
実はよく分かっていない