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

来源:互联网 发布:数控冲床编程招聘 编辑:程序博客网 时间:2024/05/22 15:48

NOIP 2017 模拟



2017 10 13




T1 :


题目:





——正解思路:

可以证明答案不超过K,直接模拟。

——我的乱搞

**没有乱搞,同正解。


tips:

难得如此稳得一逼.........






代码:


#include <iostream>#include <cstdio>#include <queue>using namespace std;queue <int> q;int main (int argc, char* argv[], char* env[]) {int n, k, x, y, ans = 0;cin>>n>>k;q.push(n);while (!q.empty()) {x = q.front();q.pop();if(x > k && !((x - k)&1)) {y = x - k >> 1;q.push (y);q.push (y + k);}else ans++;}cout<<ans<<endl;return 0;}






T2 : 


题目 :





——正解思路:

每次计算最近会相遇的一对,迭代N次。

优先队列和链表来优化。

——我的乱搞:

自以为发现了什么数学规律,然后光荣gg。


tips :

没有太大把握的题还是分段暴力吧。。。。





炸得一逼。。。。。。。。



正解如下:


#include <cstdio>#include <cctype>#include <queue>#include <cstring>#include <algorithm>#define M 200010long long N, L;int Positive[M], Negative[M];bool Visited[M];struct edge{long long StartPos, RunSpeed, identity;inline friend bool operator < (const edge &a, const edge &b) {return a.StartPos < b.StartPos;}}Runner[M];inline std::pair <long long, long long> CalTime (int i, int j) {if (Runner[i].StartPos  <Runner[j].StartPos) std::swap(i, j);return Runner[j].RunSpeed > Runner[i].RunSpeed ? std::make_pair(Runner[i].StartPos - Runner[j].StartPos, Runner[j].RunSpeed - Runner[i].RunSpeed) : std::make_pair(L - Runner[i].StartPos + Runner[j].StartPos, Runner[i].RunSpeed - Runner[j].RunSpeed);}struct node {int identity, Meeting;inline friend bool operator < (const node &a, const node &b) {std::pair <long long, long long> p1 = CalTime(a.identity, a.Meeting);std::pair <long long, long long> p2 = CalTime(b.identity, b.Meeting);return p1.first * p2.second > p2.first * p1.second;}};std::priority_queue <node> q;inline long long Read() {long long i = 0, f = 1;char c = getchar();while(!isdigit(c)){if(c == '-') f = -1; c = getchar();}while(isdigit(c)) i = (i << 3) + (i << 1) + c - 48, c = getchar();return i * f;}inline void write(long long x) {short num = 0;char c[10];while (x) c[++num] = x % 10 + 48, x /= 10;while (num) putchar (c[num--]);}long long gcd(long long x,long long y) {return x % y == 0 ? y : gcd (y, x%y);}inline void GetAns (long long Up, long long Down) {while (!q.empty()) {node t = q.top(); q.pop();int identity = t.identity, Meeting = t.Meeting;if (Visited[identity] || Visited[Meeting]) continue;if (Runner[Meeting].identity > Runner[identity].identity ) std::swap(identity, Meeting);std::pair <int, int> p = CalTime (identity, Meeting);Up = p.first, Down = p.second;Visited[Meeting] = true;int l2 = Positive[Meeting], r2 = Negative[Meeting];Negative[l2] = r2, Positive[r2] = l2;if (l2 != identity) q.push((node){identity, l2});if (r2 != identity) q.push((node){identity, r2});}long long t = gcd(Up, Down);write (Up  / t); putchar('/');write (Down/ t); putchar('\n');}inline void Suml () {std::sort(Runner, Runner + N);while (!q.empty()) q.pop();memset (Visited, false, sizeof (Visited));for (int i = 0; i < N; i++) Negative[i] = (i + 1) % N, Positive[i] = (i - 1 + N) % N;for (int i = 0; i < N; i++) q.push((node){i, (i + 1) % N});}inline void Init() {N = Read(); L = Read();for (int i = 0; i < N; i++) Runner[i].StartPos = Read(), Runner[i].identity = i;for (int i = 0; i < N; i++) Runner[i].RunSpeed = Read();}inline void slove () {int T = Read();while (T--) {Init();Suml();GetAns(0, 1);}}int main (int argc, char* argv[], char* env[]) {slove();return 0;}




T3 : 


题目 :





——正解思路:

最大生成森林。

——我的乱搞:

Wc我怎么没想到森林呢。。。


tips:

好好背模板,good good study , day day up.









英勇牺牲。。。



正解:


#ifndef Programme#include <cstdio>#include <cctype>#include <algorithm>typedef long long LL;#endif#ifndef _M#define _M 100010struct node{int From, To, Cost;node (int __F = 0, int __T = 0, int __C = 0) : From(__F), To(__T), Cost(__C) {}inline bool operator < (const node &__a) const {return Cost > __a.Cost;}}edge[_M << 1];int V, E;int Father[_M], High[_M];#undef _M#endif#ifndef __mingw_stdio_redirect__inline int Read () {int i = 0, f = 1;char c = getchar();while (!isdigit(c)) {if (c == '-') f = -1;c = getchar();}while(isdigit(c)) i = (i << 3) + (i << 1) + c - 48, c = getchar();return i;}inline void Write (int x) {short num;char c[10];do {c[++num] = x % 10 + 48;x /= 10;} while(x);while (num) putchar(c[num--]);}#endifint GetFather (int x) {return Father[x] == x ? x : Father[x] = GetFather (Father[x]);}inline bool Untie (int __a, int __b) {int Fa = GetFather (__a),Fb = GetFather (__b);if (Fa == Fb)return false;if (High[Fa] > High[Fb])Father[Fa] = Fb;else {Father[Fb] = Fa;if (High[Fa] == High[Fb])High[Fb]++;}return true;}inline void GetAns(LL &Ans) {std::sort(edge, edge + E);int cnt = 0;for (int i = 0; i < E; ++i)if (Untie(edge[i].From, edge[i].To)) {Ans -= edge[i].Cost;++cnt;}Write (E - cnt) ; putchar(' ');Write ((int)Ans); putchar('\n');}inline void Init  (LL &Ans) {V = Read();E = Read();for (int i = 0; i <= V; i++) {Father[i] = i;High[i] = 0;}for (int i = 0; i < V; i++)int X = Read(), Y = Read();Ans = 0;for (int i = 0; i < E; i++) {edge[i].From = Read();edge[i].To   = Read();edge[i].Cost = Read();Ans += edge[i].Cost;}}inline void slove () {int T = Read();LL Ans;while (T--) {Init   (Ans);GetAns (Ans);}}int main (int argc, char* argv[], char* env[]) {if (argc > 1) {freopen (argv[1], "r", stdin);}slove ();return 0;}


阅读全文
0 0
原创粉丝点击