A Accurately Say "CocaCola"!
暴力 求出 符合条件的情况好了, 反正一定是止于700的
#include<cstdio> #include<cstring> bool check(int x) { do if(x % 10 ==7) return 1; while(x /= 10); return 0; } int main(void) { int T, n, ans = -1, tem; scanf("%d", &T); while(T--) { scanf("%d",&n); tem = 0; ans = -1; for(int i = 1; i < 700; ++i) if(i % 7 ==0 || check(i)) { ++tem; if(tem >=n) { ans = i - tem + 1; break; } } else tem = 0; if(ans == -1) ans = 700; printf("%d\n", ans); } return 0; }
b Build The Electric System
普里姆算法模板
#include <vector> #include <queue> #include <cstdio> #include <cstring> using namespace std; const int LMT = 502; vector<int> gra[LMT]; int len[LMT][LMT]; bool vis[LMT]; struct mydis { int node, len; bool operator > (const mydis & y)const { return len > y.len; } mydis(int a, int b): node(a), len(b){} }; struct cmp { bool operator ()(mydis a, mydis b) { return a > b; } }; priority_queue<mydis, vector<mydis>, cmp> que; void init(void) { int i = 0; for(i = 0; i < LMT; ++i)gra[i].clear(); while(!que.empty()) que.pop(); memset(vis, 0, sizeof(vis)); } int main(void) { int i, j, T, n, m, from, to, ans; scanf("%d", &T); while(T--) { init(); scanf("%d%d", &n, &m); while(m--) { scanf("%d%d", &from, &to); scanf("%d", &len[from][to]); len[to][from] = len[from][to]; gra[from].push_back(to); gra[to].push_back(from); } que.push(mydis(0, 0)); ans = 0; for(i = 0; i < n && !que.empty();) { from = que.top().node; if(vis[from]) { que.pop(); continue; } vis[from] = 1; ans += que.top().len; que.pop(); for(j = 0; j < gra[from].size(); ++j) { to = gra[from][j]; if(0 == vis[to]) que.push(mydis(to, len[from][to])); } ++i; } printf("%d\n", ans); } return 0; }
C Colorful Rainbows
假设几何中的直线为 y = ai x + bi;
假设在区间(down,up)中 y = aix + bi > any y = aj x + bj i !=j
可以两两枚举直线,算出每个直线是否存在这样的down up
#include <cstdio> #include <cstring> #define inf 1e30 #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) const int LMT = 5002; double up_lim[LMT], dn_lim[LMT], a[LMT], b[LMT]; void init(void) { for(int i = 0; i < LMT; ++i) { up_lim[i] = inf; dn_lim[i] = -inf; } } int main(void) { int T, n, i, j, ans; double pos; scanf("%d", &T); while(T--) { init(); ans = 0; scanf("%d", &n); for(i = 0; i < n; ++i) scanf("%lf%lf", &a[i], &b[i]); for(i = 0; i < n; ++i) for(j = i + 1; j < n; ++j) { pos = (b[j] - b[i])/(a[i] - a[j]); if(a[i] - a[j] > 0) { dn_lim[i] = max(dn_lim[i], pos); up_lim[j] = min(up_lim[j], pos); } else if(a[i] - a[j] < 0) { dn_lim[j] = max(dn_lim[j], pos); up_lim[i] = min(up_lim[i], pos); } else { if(b[i] > b[j]) { dn_lim[j] = inf; up_lim[j] = -inf; } else { dn_lim[i] = inf; up_lim[i] = -inf; } } } for(i = 0; i < n; ++i) if(dn_lim[i] < up_lim[i]) ++ans; printf("%d\n", ans); } return 0; }
D 贪心+二分, 神题不会啊..
E 水
F 水
G give me the number
STL 运用题,一开始居然会忘记写‘ten’的值, 残了..
#pragma warning(disable:4786) #include <cstdio> #include <map> #include <string> #include <set> #include <cstring> using namespace std; const int LMT = 20; map<string, int> mp; set<string> rank; int main(void) { int T, ans, num,tem; char sec[12]; char tag; mp["zero"] = 0; mp["one"] = 1; mp["two"] = 2; mp["three"] = 3; mp["four"] = 4; mp["five"] = 5; mp["six"] = 6; mp["seven"] = 7; mp["eight"] = 8; mp["nine"] = 9; mp["eleven"] = 11; mp["twelve"] = 12; mp["ten"] = 10; mp["thirteen"] = 13; mp["fourteen"] = 14; mp["fifteen"] = 15; mp["sixteen"] = 16; mp["seventeen"] = 17; mp["eighteen"] = 18; mp["nineteen"] = 19; mp["twenty"] = 20; mp[ "thirty"] = 30; mp["forty"] = 40; mp["fifty"] = 50; mp["sixty"] = 60; mp["seventy"] = 70; mp["eighty"] = 80; mp["ninety"] = 90; mp["thousand"] = 1000; rank.insert("thousand"); mp["million"] = 1000000; rank.insert("million"); mp["hundred"] = 100; scanf("%d", &T); while(T--) { ans = 0; tem = 0; while(~scanf("%s", sec)) { if(rank.find(sec) != rank.end()) { num = mp[sec]; ans += tem * num; tem = 0; } else if(strcmp(sec,"hundred") == 0) tem *= 100; else tem += mp[sec]; tag = getchar(); if(tag == '\n') break; } ans += tem; printf("%d\n", ans); } return 0; }
H hurdles of 110m
简单DP ,补充体力那个状态要小心
#include<cstdio> #include<cstring> #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) const int LMT = 112; const int inf = 1e9; int dp[LMT][LMT],cos[3],t[3]; void init() { for(int i = 0; i < LMT; ++i) for(int j = 0; j < LMT; ++j) dp[i][j] = inf; } int main(void) { int T, n, m, i, j, sta, ans; scanf("%d", &T); while(T--) { init(); ans = inf; scanf("%d%d", &n, &m); dp[0][m] = 0; for(i = 1; i <= n; ++i) { scanf("%d%d%d%d%d", &t[0], &t[1], &t[2], &cos[0], &cos[2]); cos[0] *= -1; for(sta = 0; sta < 3; ++sta) for(j = m; j >=max(0, cos[sta]); --j) if(dp[i - 1][j - cos[sta]] < inf && j - cos[sta] <= m) dp[i][j] = min(dp[i][j], dp[i - 1][j - cos[sta]] + t[sta]); for(j = m; j > m - cos[2] && j >= 0; --j) if(dp[i - 1][j] < inf) dp[i][m] = min(dp[i][m], dp[i - 1][j] + t[2]); } for(i = 0; i <= m; ++i) ans = min(ans, dp[n][i]); printf("%d\n", ans); } return 0; }
I 巨烦, 靠even神了
G just pour the water
矩阵乘法 被K = 0的情况坑了
#include <cstdio> #include <cstring> const int LMT = 22; struct matrix { int n, m; double mat[LMT][LMT]; matrix (int a, int b): n(a), m(b) { memset(mat, 0, sizeof(mat)); } void clear(void) { memset(mat, 0, sizeof(mat)); } void get_e(void) { clear(); for(int i = 0; i < n; ++i) mat[i][i] = 1.0; } }; matrix operator * (const matrix &a, const matrix &b) { matrix res(a.n, b.m); for(int k = 0; k < a.m; ++k) for(int i =0; i < a.n; ++i) for(int j = 0; j < b.m; ++j) res.mat[i][j] += a.mat[i][k] * b.mat[k][j]; return res; } matrix mypow(matrix para, int p) { matrix res(para.n, para.m); res.get_e(); while(p) { if(p & 1) res = res * para; p >>= 1; para = para * para; } return res; } int main(void) { int T, i, j, to; scanf("%d", &T); while(T--) { int n, k,m; scanf("%d", &n); matrix ori(n, 1), work(n, n); for(i = 0; i < n; ++i) scanf("%lf", &ori.mat[i][0]); for(i = 0; i < n; ++i) { scanf("%d", &k); for(j = 0; j < k; ++j) { scanf("%d", &to); --to; work.mat[to][i] += 1.0/k; } if(0 == k) work.mat[i][i] = 1; } scanf("%d", &m); work = mypow(work, m); ori = work * ori; for(i = 0; i < n; ++i) { if(i)printf(" "); printf("%.2lf", ori.mat[i][0]); } printf("\n"); } return 0; }
K king of fuwas
难道不该用%I64d输出的时候用,会判PE???
#include <cstdio> #include <cstring> const int LMT = 255; typedef int LL; char gra[LMT][LMT]; int have[5][LMT][LMT]; int is[100]; LL ans; int main(void) { int T, n, m, i, j, ii; scanf("%d", &T); is['B'] = 0; is['H'] = 2; is['J'] = 1; is['Y'] = 3; is['N'] = 4; while(T--) { memset(have, 0 , sizeof(have)); ans = 0; scanf("%d%d", &n, &m); for(i = 0; i < n; ++i) scanf("%s", gra[i]); for(j = 0; j < m; ++j) for(i = 0; i < n; ++i) for(ii = i + 1; ii < n; ++ii) if(gra[i][j] == gra[ii][j]) ++have[is[gra[i][j]]][i][ii]; for(i = 0; i < n; ++i) for(ii = i + 1; ii < n; ++ii) { ans += LL(1) * have[0][i][ii] * (have[0][i][ii] - 1)/2; ans += LL(1) * have[1][i][ii] * (have[1][i][ii] - 1)/2; ans += LL(1) * have[2][i][ii] * (have[2][i][ii] - 1)/2; ans += LL(1) * have[3][i][ii] * (have[3][i][ii] - 1)/2; ans += LL(1) * have[4][i][ii] * (have[4][i][ii] - 1)/2; } printf("%d\n", ans); } return 0; }
L 水,一年前搞过了...