【组队训练】2013天津区域赛
三题,按现场排名应该是80名,铜牌靠后。
几次训练发现自己的心理素质实在是太!差!了!一开始,老规矩,我k题,zrA题,ysB题。
A题大模拟,比较费时,zr先看了过了几个人的H,31mins,1A
B题过的人越来越多,我看了N久终于看懂K题……不会做……我去问ys怎么样,他说了下题意,我觉得很水的暴力,让他直接写,他一直在和我讲说复杂度不够。我有点不耐烦,直接上机写。写的过程中出了点小问题,不过还是水题,一个小时左右1A
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <iostream> using namespace std; typedef long long ll; const int N = 1000005; const int INF = 0x5f5f5f5f; const int MOD = 1000000007; ll cal(int x, int m) { ll ans = 0; int f = m; while (x) { int z = x%m; ans += z*z; x /= m; } return ans; } void output(ll x, int m) { char ans[100]; int idx = 0; while (x) { int z = x%m; if (z < 10) ans[idx++] = z + '0'; else ans[idx++] = z - 10 + 'A'; x /= m; } for (int i = idx-1; i >= 0; --i) printf("%c", ans[i]); printf("\n"); } void solve(int n, int m) { ll ans = 0; int lit = sqrt(n); for (int i = 1; i <= lit; ++i) { if (n % i == 0) { ans += cal(i, m); if (i != n/i) ans += cal(n/i, m); } } output(ans, m); } int main() { //freopen("in.txt", "r", stdin); int n, m; while (~scanf("%d%d", &n, &m)) { solve(n, m); } return 0; }
然后看C题,我直接想到dp方程dp[i][j][k]表示前i个数已经排好,i+1是j,i+2是k的最小步数。但是转移方程没想好。和队友说了一下开始写,快写好的时候队友看了一眼,说由各情况没有考虑到,我一想确实是,心情瞬间就很烦躁,队友和我说思路的时候我不是很想理他,心情很烦,因为觉得全写错了(实际上只是差了一点),直接和队友说你有思路你写把,我不管了/我去想E,结果没想出来,后来队友说C他写错了,我已经想明白了,写了一发之后出了点bug,最后两个字母的旋转没考虑,上了个厕所突然明白,n+2之后解决,一共用了一个小时左右,1A
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <vector> #include <iostream> using namespace std; typedef long long ll; const int N = 1005; const int INF = 0x5f5f5f5f; const int MOD = 1000000007; char a[N], s[N]; int dp[N][30][30]; int move(int p, int x) { return (p+x+10)%10; } void mi(int &x, int y) { if (x == -1 || x > y) x = y; } int step(int x, int y) { if (x>y) swap(x, y); return min(y-x, x+10-y); } int main() { //freopen("in.txt", "r", stdin); while (~scanf("%s%s", a+1, s+1)) { int n = strlen(a+1); for (int i = 1; i <= n; ++i) { a[i]-='0'; s[i]-='0'; } n+=2; memset(dp, -1, sizeof dp); dp[0][a[1]][a[2]] = 0; for (int i = 0; i <= n-2; ++i) { for (int j = 0; j <= 9; ++j) { for (int k = 0; k <= 9; ++k) { if (dp[i][j][k] < 0) continue; for (int p = -4; p <= 5; ++p) { for (int q = -4; q <= 5; ++q) { int x = move(j, p+q); //i+1 int y = move(k, p+q); //i+2 int z = move(a[i+3], q);//i+3 int sp = step(x, s[i+1]); mi(dp[i+1][y][z], dp[i][j][k] + sp + abs(p) + abs(q)); } } } } } int ans = INF; for (int i = 0; i <= 9; ++i) { for (int j = 0; j <= 9; ++j) { if (dp[n-2][i][j] >= 0) ans = min(ans, dp[n-2][i][j]); } } printf("%d\n", ans); } return 0; }
这时就剩半个小时了,他们两个在讨论A,其实我也看了,不过也没相处什么清晰的写法,就挂机了。zr尝试着写,结果还是除了问题,没能在比赛结束前写完。
我觉得我如果C题队友提醒我错了的时候,冷静下来好好想想,而不是硬拉着队友写,自己逃避,会减少很多浪费时间。只能说队友脾气都很好,没有生气,如果都像我这么情绪化……估计会打起来。。。。
以后一定要学会克制自己的负面情绪。。。克制。。克制。。
----
计划补题:E图论 F后缀自动机 Ksplay+线段树 //马丹 怎么都是我的
任重而道远阿~~~