C-六学家的困惑
贪心,两个字符串反转,与字符串判断,取大的字符串,这样就是最优策略了,如45884就会变成48854,先出4,后就可以出8了,而不是4先后5
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
static const ll Mod = 1e9 + 7;
static const int MAX_N = 1e6 + 5;
string s1, s2;
int main() {
/*freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);*/
int T;
scanf("%d", &T);
for (int cas = 1; cas <= T; ++cas) {
cin >> s1 >> s2;
printf("Case #%d: ", cas);
while (!s1.empty() || !s2.empty()) {
string temp = s1;
reverse(temp.begin(), temp.end());
s1 = max(s1, temp);
temp = s2;
reverse(temp.begin(), temp.end());
s2 = max(s2, temp);
if (s1.empty() || s1 < s2) swap(s1, s2);
cout << s1[0];
s1.erase(0, 1);
}
putchar('\n');
}
return 0;
}
E-数独挑战
之前写过数独dfs,但听说大佬们都是Dance Links写的(orz.)
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int maps[15][15];
int cnt;
pair<int, int>p[100];
bool flag;
void print() {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 8; ++j) printf("%d ", maps[i][j]);
printf("%d\n", maps[i][8]);
}
}
bool judge(int x, int y, int v) {
for (int i = 0; i < 9; i++) {
if (maps[i][y] == v) return false;
if (maps[x][i] == v) return false;
}
int fx = x / 3 * 3, fy = y / 3 * 3;
for (int i = fx; i < fx + 3; i++) {
for (int j = fy; j < fy + 3; j++) {
if (maps[i][j] == v) return false;
}
}
return true;
}
void dfs(int s) {
if (flag) return;
if (s == cnt) {
print();
flag = true;
return;
}
for (int i = 1; i <= 9; ++i) {
if (flag) return;
if (judge(p[s].first, p[s].second, i)) {
maps[p[s].first][p[s].second] = i;
dfs(s + 1);
}
}
if (flag) return;
maps[p[s].first][p[s].second] = 0;
}
int main() {
/*freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);*/
cnt = 0;
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
scanf("%d", &maps[i][j]);
if (maps[i][j] == 0) {
p[cnt].first = i;
p[cnt++].second = j;
}
}
}
flag = false;
dfs(0);
return 0;
}
F-翻牌游戏
从n=2开始琢磨,最优概率肯定是 ,到n = 3,发现期望之和为
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
static const ll Mod = 1e9 + 7;
static const int MAX_N = 1e6 + 5;
int main() {
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
printf("%.2f\n", 2.0 * n - 1);
}
return 0;
}
H-Parco_Love_GCD
两个for循环累加个gcd的值,中间需要特判一下出现所有数公共gcd的情况
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
static const ll Mod = 1e9 + 7;
static const int MAX_N = 1e6 + 5;
int a[MAX_N];
ll gcd(ll x, ll y) {
return y == 0 ? x : gcd(y, x % y);
}
int main() {
/*freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);*/
int n;
scanf("%d", &n);
ll c_gcd = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
c_gcd = gcd(c_gcd, (ll)a[i]) % Mod;
}
ll res = 0;
for (int i = 0; i < n; ++i) {
ll x = 0;
for (int j = i; j < n; ++j) {
x = gcd(x, (ll)a[j]);
if (x == c_gcd) {
res = (res + (n - j) * c_gcd) % Mod;
break;
}
else res = (res + x) % Mod;
}
}
printf("%lld\n", res);
return 0;
}
I-炒股
取上升序列的差值
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
static const ll Mod = 1e9 + 7;
static const int MAX_N = 5e5 + 5;
int a[MAX_N];
int main() {
/*freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);*/
int n;
scanf("%d", &n);
ll maxl = 0;
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
for (int i = 1; i < n; ++i) {
if (a[i] - a[i - 1] > 0) maxl += a[i] - a[i - 1];
}
printf("%lld\n", maxl);
return 0;
}