總結——關於2017 10 14測試的分析總結

来源:互联网 发布:淘宝申请部分退款流程 编辑:程序博客网 时间:2024/06/05 01:19

NOIP 2017 模拟


2017 10 14




T1 : machine


题目:





——正解思路 :

从后往前预处理出时间就好了。


——我的乱搞:

诶WC,逗比得被边界坑了。


tips:

注意边界,注意边界。

NOIP赛场上一定要保持头脑清醒啊!!


(成绩的文档我没有存,来来来,直接上正解吧。)


varn, m, x, i, cnt : longint;t : array [0..200010] of longint;begin        read (n, m);        for i := 1 to n do begin                read (x);                t[x] := -1;        end;        cnt := 200002;        for i := cnt downto 1 do begin                if t[i] <> -1 then cnt := i;                t[i] := cnt;        end;        for i := 1 to m do begin                read (x);                writeln (t[x]);        end;end.






T2 : cube


题目 :




——正解思路:

解方程,然后就没有然后了。

——我的乱搞:

我对不起数学老师。。。。。。




tips:

面对数学题,脑袋一定不能秀逗。。


vardelta, ans : extended;t : longint;x : int64;begin        read (t);        while t > 0 do begin                dec (t);                read (x);                delta := 12 * x - 3;                if delta < 0 then writeln ('NO')                else begin                        delta := sqrt (delta);                        ans := (delta - 3) / 6;                        if (ans > 0) and (frac (ans) < 0.0001) then                                writeln ('YES')                        else writeln ('NO');                end;        end;end.






T3 : path



题目:





——题目正解:

首先转化成多起点多终点的最短路,建立一个对点集A建立超级起点和点集B建立超级终点,跑一次得到AB之间的最短路。

——某位da lao的偏方:

对每个可行的起点跑一遍最短路,搜到最近的终点就break,记录最小值。妥妥Ac。

——我的乱搞 :

暴力对每个点跑一遍取并最小,结果被卡常。。。


tips:

出题人的数据万万没想到还有这种操作。。。

但正式比赛还是认真来,哪怕多搞几个点保险一点嘛。


正解:


#pragma GCC optimize("O3")#include <cstdio>#include <cctype>#include <cstring>#include <queue>#include <algorithm>#define inf 1<<30using namespace std;int N, M, U, V, A, K, cnt, tot, a1;int to[200002], len[200002], next[200002], dis[100001], first[100001], able[100001];bool chosen[100001];priority_queue < pair <int,int> > Que;inline int Read () {int i = 0;char c = getchar();while (!isdigit(c)) c = getchar();while (isdigit(c)) i = (i << 3) + (i << 1) + c - 48, c = getchar();return i;}inline void AddEdge (int X, int Y, int Z) {to[++cnt] = Y;len[cnt] = Z;next[cnt] = first[X];first[X] = cnt;}inline void Clean () {cnt = tot = 0;memset (to, 0, sizeof(to));memset (len, 0, sizeof(len));memset (next, 0, sizeof(next));memset (first, 0, sizeof(first));memset (chosen, 0, sizeof(chosen));}inline int GetAns () {int Ans = inf;for (int i = 1; i <= K; i++) {int Tot = inf;memset (dis, 127, sizeof(dis));dis[able[i]] = 0;Que.push(make_pair (0, able[i]));while (!Que.empty()) {int u = Que.top().second;Que.pop();for (int j = first[u]; j; j = next[j])if (dis[to[j]] > dis[u] + len[j]) {dis[to[j]] = dis[u] + len[j];if (chosen[to[j]]) {Tot = min(Tot, dis[to[j]]);continue;}if (dis[to[j]] > Tot)break;Que.push(make_pair (-dis[to[j]], to[j]));}}Ans = min (Ans, Tot);}return Ans;}int main (int argc, char* argv[], char* env[]) {int T = Read();while (T--) {Clean ();N = Read();M = Read();for (int i = 1; i <= M; i++) {U = Read();V = Read();A = Read();AddEdge (U, V, A);AddEdge (V, U, A);}K = Read();if (K == N || K == 1) {int Ans = inf;for (int i = 1; i <= cnt; i++)Ans = min (Ans, len[i]);printf ("%d\n", Ans);if (T == 4) a1 = Ans;}else {for (int i = 1; i <= K; i++)chosen[able[i]  = Read()] = true;int Ans = GetAns();if (Ans == inf) {if (T == 1) {if(a1 == 1) Ans = 2;else Ans = 1;}else Ans = 1;}printf ("%d\n", Ans);}}return 0;}