A: やるだけ
B: どういう数列に変化させるのが最適かは簡単に分かる。1ステップでは出来る限り範囲をインクリメントするべき。
C: dp[ n桁目 ][ 最後に使った数字 ][ 小さくなったか ][ 最初の非 0 の数字 ]
D: やるだけ
以下、本番で投げたコード
A
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)
typedef long long int lli;
using namespace std;
int main(int argc, char *argv[])
{
int n;
while (cin >> n) {
int m[n];
for (int i = 0; i < n; ++i) {
cin >> m[i];
}
const string S = "Still Rozdil";
const int *mn = min_element(m, m + n);
if (count(m, m + n, *mn) == 1) cout << mn - m + 1 << endl;
else cout << S << endl;
}
return 0;
}
B
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)
typedef long long int lli;
using namespace std;
int main(int argc, char *argv[])
{
lli n;
while (cin >> n) {
lli m[n];
for (int i = 0; i < n; ++i) {
cin >> m[i];
}
lli x[n];
x[0] = m[0];
for (int i = 1; i < n; ++i) {
x[i] = max(x[i - 1], m[i]);
}
lli diff[n];
for (int i = 0; i < n; ++i) {
diff[i] = x[i] - m[i];
}
lli sum = 0;
lli y = 0;
for (int i = 0; i < n; ++i) {
if (diff[i] <= y) y = diff[i];
else {
sum += diff[i] - y;
y = diff[i];
}
}
cout << sum << endl;
}
return 0;
}
C
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)
typedef long long int lli;
using namespace std;
const int D = 20;
vector<int> v;
lli memo[D][11][11][12];
lli rec(int d, int last, bool small, int first)
{
lli &ret = memo[d][last][small][first];
if (ret != -1) return ret;
if (v.size() == d) return ret = (last == first);
lli sum = 0;
if (small) {
for (int i = 0; i <= 9; ++i) {
sum += rec(d + 1, i, true, (first == 11 && i ? i : first));
}
} else {
for (int i = 0; i <= v[d]; ++i) {
sum += rec(d + 1, i, i < v[d], (first == 11 && i ? i : first));
}
}
return ret = sum;
}
lli f(lli n)
{
v.clear();
while (n) {
v.push_back(n % 10LL);
n /= 10LL;
}
reverse(v.begin(), v.end());
fill(&memo[0][0][0][0], &memo[D][0][0][0], -1);
return rec(0, 10, false, 11);
}
int main(int argc, char *argv[])
{
lli small, large;
while (cin >> small >> large) {
cout << f(large) - f(small - 1) << endl;
}
return 0;
}
D
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)
typedef long long int lli;
using namespace std;
int main(int argc, char *argv[])
{
int n;
while (cin >> n) {
map<lli, lli> F, B;
pair<lli, lli> p[n];
for (int i = 0; i < n; ++i) {
cin >> p[i].first >> p[i].second;
++F[p[i].first];
if (p[i].first != p[i].second) ++B[p[i].second];
}
const lli H = (n + 1) / 2;
const lli inf = 1LL << 60;
lli mn = inf;
for (int i = 0; i < n; ++i) {
if (H <= F[p[i].first] + B[p[i].first]) {
lli cost = (H - F[p[i].first]);
mn = min(mn, cost);
}
if (H <= F[p[i].second] + B[p[i].second]) {
lli cost = (H - F[p[i].second]);
mn = min(mn, cost);
}
}
mn = max(mn, 0LL);
cout << (mn == inf ? -1 : mn) << endl;
}
return 0;
}