前言:三道大水题。。。


纸牌

题目描述

纸牌选手wyz喜欢玩纸牌。
wyz有2n张纸牌,点数分别为1到2n。wyz要和你玩一个游戏,这个游戏中,每个人都会分到n张卡牌。游戏一共分为n轮,每轮你们都要出一张牌,点数大者获胜。
不自量力的wyz觉得你很菜,于是每轮他都会先于你出牌,你可以根据他出的牌来做决策。
游戏开始了,你拿到了你的牌,你现在想知道,你最多能够获胜几轮?

对于32.5%的数据,保证1<=n<=100
对于100%的数据,保证1<=n<=50,000
保证数据的合法性,即你即不会拿到重复的牌,又不会拿到超出点数范围的牌。


输入格式

第一行1个正整数n。
第2行到第n+1行每行一个正整数a[i],表示你的第i张牌的点数。


输出格式

一行一个整数表示你最多能够获胜的轮数。


输入样例

2
1
4


输出样例

1


题解(贪心+单调)

这题就是什么塞翁失马,应该是田忌赛马的加强版。

我们将手牌按小到大排序,然后用自己的牌去吃对方的牌,由于单调递增,所以时间O(n)O(n)。


代码

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#define N 100010using namespace std;int n, x, ans;
int a[N], b[N];
bool vis[N];int main(){scanf("%d", &n);for(int i = 1; i <= n; i++){scanf("%d", &x);vis[x] = true;}for(int i = 1; i <= 2*n; i++){if(vis[i])  a[++a[0]] = i;else  b[++b[0]] = i;}for(int i = 1, j = 1; i <= n; i++){for(; j <= n; j++)  if(a[j] > b[i]){ans ++;j ++;break;}}printf("%d\n", ans);return 0;
}

杯具

题目描述

杯具选手wyz喜欢玩杯具。
wyz有2个容量分别为n单位、m单位的没有刻度的杯具。wyz有t分钟可以摆弄他的杯具。每一分钟,他都可以做下面4件事中的任意一件:
(1)用水龙头放满一个杯具。
(2)倒空一个杯具。
(3)把一个杯具里的水倒到另一个杯具里,直到一个杯具空了或者另一个杯具满了。(看哪种情况先发生)
(4)什么都不做。
wyz希望最后能获得d个单位的水,假设最后两个杯具中水量的总和为x,那么他的不开心度就为|d-x|。
现在你想知道,wyz的不开心度最小是多少。

对于10%的数据,保证t=1
对于20%的数据,保证t<=2
对于40%的数据,保证t<=4
对于100%的数据,保证1<=n,m<=100,1<=t<=100,1<=d<=200


输入格式

第一行4个整数n、m、t、d,分别表示两个杯具的容量、时间限制以及期望值。


输出格式

一行一个整数表示wyz的最小不开心度。


输入样例

7 25 2 16


输出样例

9


题解(dp/bfs)

我都不想说这题了,话说这不是普及组难度吗?一个很简单的dp,以时间为阶段,记录两个杯子分别的水量是否可以到达,f[i][j][k]=true/falsef[i][j][k]=true/false。然后直接推,最后找答案。

或者直接无脑宽搜,哪种都好,n<script type="math/tex" id="MathJax-Element-81">n</script>才100,时间完全不是问题。

然而我考试时闲得无聊,两种方法都写了,还拿来拍了半天。。。


代码(dp)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <iostream>
#define N 111
#define oo 0x7fffffffusing namespace std;int n, m, T, D, ans = oo;
bool f[N][N][N];int main(){scanf("%d%d%d%d", &n, &m, &T, &D);f[0][0][0] = true;for(int i = 0; i < T; i++)for(int c1 = 0; c1 <= n; c1++)for(int c2 = 0; c2 <= m; c2++){if(!f[i][c1][c2])  continue;f[i+1][c1][c2] = true;f[i+1][0][c2] = true;f[i+1][c1][0] = true;f[i+1][n][c2] = true;f[i+1][c1][m] = true;if(n - c1 >= c2)f[i+1][c1+c2][0] = true;elsef[i+1][n][c2-n+c1] = true;if(m - c2 >= c1)f[i+1][0][c1+c2] = true;elsef[i+1][c1-m+c2][m] = true;}for(int c1 = 0; c1 <= n; c1++)for(int c2 = 0; c2 <= m; c2++){if(!f[T][c1][c2])  continue;ans = min(ans, abs(c1+c2-D));}printf("%d\n", ans); return 0;
}

代码(bfs)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <iostream>
#define N 111
#define oo 0x7fffffffusing namespace std;int n, m, T, D, ans = oo;
bool f[N][N][N];
struct Data{int t, c1, c2;Data() {}Data(int _t, int _c1, int _c2):t(_t), c1(_c1), c2(_c2) {}
}q[N*N*N];
int head, tail;int main(){scanf("%d%d%d%d", &n, &m, &T, &D);q[0] = Data(0, 0, 0);f[0][0][0] = true;while(head <= tail){int i = q[head].t, c1 = q[head].c1, c2 = q[head].c2;head ++;if(i == T)  continue;if(!f[i+1][c1][c2]){q[++tail] = Data(i+1, c1, c2);f[i+1][c1][c2] = true;}if(!f[i+1][0][c2]){q[++tail] = Data(i+1, 0, c2);f[i+1][0][c2] = true;}if(!f[i+1][c1][0]){q[++tail] = Data(i+1, c1, 0);f[i+1][c1][0] = true;}if(!f[i+1][n][c2]){q[++tail] = Data(i+1, n, c2);f[i+1][n][c2] = true;}if(!f[i+1][c1][m]){q[++tail] = Data(i+1, c1, m);f[i+1][c1][m] = true;}if(n - c1 >= c2){if(!f[i+1][c1+c2][0]){q[++tail] = Data(i+1, c1+c2, 0);f[i+1][c1+c2][0] = true;}}else{if(!f[i+1][n][c2-n+c1]){q[++tail] = Data(i+1, n, c2-n+c1);f[i+1][n][c2-n+c1] = true;}}if(m - c2 >= c1){if(!f[i+1][0][c1+c2]){q[++tail] = Data(i+1, 0, c1+c2);f[i+1][0][c1+c2] = true;}}else{if(!f[i+1][c1-m+c2][m]){q[++tail] = Data(i+1, c1-m+c2, m);f[i+1][c1-m+c2][m] = true;}}}for(int c1 = 0; c1 <= n; c1++)for(int c2 = 0; c2 <= m; c2++){if(!f[T][c1][c2])  continue;ans = min(ans, abs(c1+c2-D));}printf("%d\n", ans); return 0;
}

辣鸡

题目描述

wyz在后院养了许多辣鸡。wyz的后院可以看成一个A*B的矩形,左下角的坐标为(0,0),右上角的坐标为(A,B)。
wyz还在后院里建了许多栅栏。有n个平行于y轴的栅栏a1..an,表示挡在(ai,0)到(ai,B)之间。有m个平行于x轴的栅栏b1..bn,表示挡在(0,bi)到(A,bi)之间。这样,平面被划成了(n+1)*(m+1)块辣鸡的活动区域。
为了方便辣鸡的活动,wyz现在要去掉某些栅栏的一部分,使得每一块活动区域都连通。
同时,每次修改栅栏只能去掉从某个交点到另一个交点的一整段栅栏。举(打)个比(栗)方(子):

原来是这样的布局,经过修改可以变成这样:

现在,wyz想知道,要使得每一块辣鸡活动区域都联通,最少需要去掉多少长度的栅栏。
对于10%的数据,A,B<=1000,n,m<=20
对于30%的数据,A,B<=1000,000,n*m<=25,000
对于40%的数据,n*m<=250,000
对于50%的数据,n*m<=4,000,000
对于100%的数据,1<=A,B<=1000,000,000,1<=n,m<=25,000
数据保证 0 < a[i] < A,0 < b[i] < B


输入格式

第一行4个正整数A、B、n、m,描述了后院的大小和两种栅栏的数目。
第2行到第n+1行,每行1个正整数,第i+1行的数描述了a[i]。
第n+2行到第n+m+1行,每行1个正整数,第n+i+1行的数描述了b[i]。


输出格式

一行一个整数表示需要去掉的栅栏的最小长度总和。


输入样例

15 15 5 2
2
5
10
6
4
11
3


输出样例

44


题解(MST+找规律)

这是题原题。。。
题目很明显是在求最小生成树。

转化就像下图一样:

原图中的横着的栅栏就是竖着的边,竖着的栅栏就是横着的边,每一横排、竖排的边权一样。破坏栅栏就是在连边。如果直接做Kruskal肯定超时,然而第一次做这题的时候,脑壳坏了,想不到该怎么搞,结果就直接来了。甚至我想到了排序后必然是一段一段的,但是判环还是没有想到点上。

那时随便在草稿上画了一下,发现一开始的情况和后来不太一样,觉得没什么规律可循。其实就是有规律可循啊。。。

我们发现每次必然加整一行或列,出现环就会少加一部分,行少加是受到列的影响,列也一样。行一开始整行加,后来有了两列一行后,再整行加就会有环,只能少加一个,后面随着列的增加,行越加越少,每次少一,这就发现了规律。列也是一样的(画个图比较好理解)。

于是直接将读入转成边排序,然后按着规律加边算答案。
再见,超时。


代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define N 25010using namespace std;typedef long long LL;
LL A, B, a[N], b[N], ans;
int n, m, Rcnt, Lcnt;struct Data{LL len, id;bool operator < (const Data& Q)const {return len < Q.len;}
}fen[N<<1];int main(){scanf("%lld%lld%d%d", &A, &B, &n, &m);for(int i = 1; i <= n; i++)  scanf("%lld", &a[i]);for(int i = 1; i <= m; i++)  scanf("%lld", &b[i]);a[0] = 0;  a[n+1] = A;b[0] = 0;  b[m+1] = B;sort(a, a+n+2);sort(b, b+m+2);for(int i = 1; i <= n+1; i++)  fen[i].len = a[i] - a[i-1], fen[i].id = 0;for(int i = 1; i <= m+1; i++)  fen[i+n+1].len = b[i] - b[i-1], fen[i+n+1].id = 1;sort(fen+1, fen+n+m+3);for(int i = 1; i <= n + m + 2; i++){if(!fen[i].id){if(Rcnt >= 2 && Lcnt >= 1)  ans += fen[i].len * (m - Rcnt + 1);else  ans += fen[i].len * m;Lcnt ++;}else{if(Lcnt >= 2 && Rcnt >= 1)  ans += fen[i].len * (n - Lcnt + 1);else  ans += fen[i].len * n;Rcnt ++;}}printf("%lld\n", ans);return 0;
}

总结

这次比赛太水了,有十几个人AK,只有蒟蒻我还在水总结。


黑暗。

sc2017新高二高一模拟赛7 总结相关推荐

  1. 省选模拟赛记录(越往下越新哦~~~)

    LOG 模拟赛 第一次见尼玛这么给数据范围的-- 开考有点困,迷迷糊糊看完了三道题,真的是像老吕说的那样,一道都不会-- 思考T1,感觉有点感觉,但是太困了,就先码了暴力,发现打表可以50分,于是就大 ...

  2. 2021年暑假数学建模第一次模拟赛:新冠疫情预测(插值,时间序列,微分方程建模)

    本系列赛题.数据获取: 2021年暑假数学建模模拟赛(赛题+数据+分析) 不直接提供论文等资料,分析已经很详细了 整理不易,欢迎点赞+关注+收藏 2021年暑假数学建模第一次模拟赛:新冠疫情预测(插值 ...

  3. PKUWC2019 赛前模拟赛总结

    PKUWC2019赛前模拟赛总结 2019.01.17-01.19 清华北大高校的冬令营是自己梦寐以求的. 在NOIP之前,大家都普遍认为我们初二同学提高组达到了400分,至多420分,就可以参加清华 ...

  4. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  5. 2020年蓝桥杯模拟赛2020.3.25直播笔记

    2020年蓝桥杯模拟赛解题报告(CPP版本) 第八题 长草的bfs写法[我想暴力模拟O kmn] 深搜会爆 bfs像投到水里的涟漪 问题: const int dx[] = {1, 0, -1, 0} ...

  6. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  7. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  8. 3.27模拟赛 sutoringu(后缀数组)

    \(\color{white}{mjt是机房模拟赛独自切过题的唯一的人...}\) (应本人要求删掉惹) \(Description\) 给你\(n,k\)和长为\(n\)的字符串\(s\).一个区间 ...

  9. ssl提高组周六模拟赛【2018.9.8】

    前言 开学后,新学年新气象,学校题库也迎来了新的改动,界面大改变,也可以比赛了. 所以这周就有比赛了,而在纪中被虐习惯后回来渴望继续被虐就来参加提高组模拟赛(反正今年也参加提高组) 成绩 只放Rank ...

最新文章

  1. 【最小费用最大流】N. April Fools' Problem (medium)
  2. Windows环境下如何配置wamp的虚拟域名
  3. Java虚拟机:Java中堆和栈的详细区别
  4. Python面向对象(三)
  5. OC仿支付宝输入UITextField输入车牌号
  6. 使用data()方法缓存数据
  7. 如何实现一平台多系统_自动化设备数据采集系统如何实现
  8. LOAD-OF-PROGRAM
  9. 重量级!Maven史上最全教程,看了必懂
  10. 弥补Reflector反编译对中文支持的不足
  11. 写滚动字幕html5源码,[转载]滚动字幕的源代码
  12. Excel - 数组类型及数组公式
  13. sketch up rbs/rbz/rb插件安装方法
  14. cad剖切线的快捷键_cad快捷键(最全CAD快捷键大全 )
  15. 小雨伞java下载安装教程_TinyUmbrella小雨伞怎么用_TinyUmbrella小雨伞下载及使用教程 - 软件教程 - 格子啦...
  16. 牛逼的Python库MoviePy!利用Python自动剪辑tiktok视频!
  17. 解决苹果手机app store下载软件超过200M后必须使用wifi的终极方法(亲测有效)
  18. 计算机专业考农业工程与信息技术,中国农业大学农业工程与信息技术2021考研经验指导...
  19. Cognex Deep Learning Studio 启动报错的问题
  20. 智慧城市-物联网的衍生物

热门文章

  1. kaggle Notebook Threw Exception问题解决
  2. 时统ptp_【学术论文】麒麟操作系统平台软时统同步方法研究
  3. Android开发学习之Intent具体解释
  4. Ubuntu 10.10 无线网络已经禁用” “wiress is disabled” 解决方法
  5. 在Windows10系统中同步Internet 时间
  6. python迅雷下载任务出错_迅雷下载任务出错的原因和解决方法 来研究下吧
  7. C语⾔核⼼基础知识之printf
  8. ROS中使用protoBuf通信
  9. 红黑树和二叉树有什么区别?
  10. [已解决]Notepad++ 无法安装HexEditor