前4道水题就不说了,其中我做了C题,1Y,小心仔细写代码并且提交之前得确认无误后提交才能减少出错率。
结果后面2题都由波神做掉,学长带我们飞~
题意:求到所有点最短花费时间总和以及在这前提下的走过的路的最小花费金钱
分析:首先最短路跑一个,然后在d[v] == d[u] + time的一些边上选择最小金钱,注意这里只要cost[v] = cost不用累加cost[u]。就是跑了两次最短路。
#includetypedef long long ll;const int N = 1e5 + 5;const int INF = 0x3f3f3f3f;struct Edge { int v, t, c, nex;};Edge edge[N<<1];int head[N];ll _time[N];int cost[N];bool vis[N];int n, m, tote;void SPFA(int s, ll &sumt, ll &sumc) { memset (vis, false, sizeof (vis)); memset (_time, INF, sizeof (_time)); vis[s] = true; _time[s] = 0; std::queue que; que.push (s); while (!que.empty ()) { int u = que.front (); que.pop (); vis[u] = false; for (int i=head[u]; ~i; i=edge[i].nex) { Edge &e = edge[i]; if (_time[e.v] > _time[u] + e.t) { _time[e.v] = _time[u] + e.t; if (!vis[e.v]) { vis[e.v] = true; que.push (e.v); } } } } memset (vis, false, sizeof (vis)); memset (cost, INF, sizeof (cost)); vis[s] = true; cost[s] = 0; que.push (s); while (!que.empty ()) { int u = que.front (); que.pop (); vis[u] = false; for (int i=head[u]; ~i; i=edge[i].nex) { Edge &e = edge[i]; if (_time[e.v] == _time[u] + e.t && cost[e.v] > e.c) { cost[e.v] = e.c; if (!vis[e.v]) { vis[e.v] = true; que.push (e.v); } } } } for (int i=1; i
题意:Monday是1日或11日或21日的那天是lucky week day,给了开始日期,问从该天起第N天是哪天。(波神一开始就说是循环节,我一听是循环节感觉很陌生,一脸懵逼,当时还看错题意,Monday还看漏了,赛后补了,发现还是很好做的。)
分析:打表找规律,发现400年一个周期,一个周期有2058天lucky day。对于询问只要取模一下,再400乘回来就行了。
#includetypedef long long ll;int _month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool judge(int y) { if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) { return true; } else { return false; }}struct Data { int y, m, d;};std::vector vec;void init() { int day = 1; //从注释的代码得知只要处理出400年的循环节 for (int i=1753; i<=1753+399; ++i) { for (int j=1; j<=12; ++j) { int mday = _month[j]; if (judge (i) && j == 2) { mday++; } while (day <= mday) { if (day == 1 || day == 11 || day == 21) { vec.push_back ((Data) {i, j, day}); } day += 7; } day -= mday; } } //calc /* for (int i=0; i = 1753 + 400) { y -= 400; ady++; } ady += (n - 1) / sz; //add year 2 int add = (n - 1) % sz; ll ty = y, tm = m, td = d; for (int i=0; i = sz) { ti -= sz; ady++; } ty = vec[ti].y + 1ll * ady * 400; tm = vec[ti].m; td = vec[ti].d; break; } } printf ("%lld %lld %lld\n", ty, tm, td); } return 0;}