JZOJ 2020.01.11【NOIP提高组】模拟B组
2020.01.11【NOIP提高组】模拟B组
今天的题是不是和 \(C\) 组放错了?
呵呵
然,却只有 \(300\) 分
首先,\(T4\) 看错题了
后,一时想不到正解
讨论区,一看,三个字——网络流
恍然大悟
脑推了一下,遂得正解
进入正题:
\(T1\)
题目大意:设一矩阵,分东西南北四个方向(上北下南左西又动),从西南角出发,然后到北边的任一位置,再到南边的任一位置,最后到东北角,求最短距离。
果真水!
将军饮马问题
直接以北线为对称轴把西南角映射过去,再以南线为对称轴把东北角映射过去,求这映射后的两点距离,原理:两点之间线段最短
代码
#include<cstdio>
#include<cmath>
using namespace std;
double w , h , ans;
int main()
{
scanf("%lf%lf" , &w , &h);
ans = sqrt(9 * h * h + w * w);
printf("%.0lf" , ans);
}
\(T2\)
题目大意:有2n个人在售票处排队买票,门票5元一张,恰有n个人每人有5元一张的人民币,另n个人每人只有10元一张的人民币。
最开始售票处没有零钱,问最后2n个人都能顺利买到票(即能够成功找零)的排列有多少种?
解析:瞟一眼,特性:任何时刻 \(5\) 元的不少于 \(10\) 元的
啊啊啊啊啊
卡特兰数!秒切!!
通项公式:
\]
代码
#include<cstdio>
using namespace std;
typedef long long LL;
LL fm[50] , fz[50] , ans = 1;
int mt , zt , n;
int main()
{
scanf("%d" , &n);
for(register int i = (n << 1); i >= (n + 1); i--) fm[++mt] = (LL)i;
for(register int i = (n + 1); i >= 2; i--) fz[++zt] = (LL)i;
for(register int i = 1; i <= mt; i++)
for(register int j = 1; j <= zt; j++)
if (fm[i] % fz[j] == 0 && fz[j] != 1) fm[i] = fm[i] / fz[j] , fz[j] = 1;
for(register int i = 1; i <= mt; i++) ans *= fm[i];
for(register int i = 1; i <= zt; i++) ans /= fz[i];
printf("%lld" , ans);
}
\(T3\)
题目大意:给定一个N*M的迷宫和一个机器人,迷宫里有一些障碍物,机器人无法通过。现在机器人要从起点走到终点,每个时刻可以执行三种操作:前进,左转,右转。
前进无需费用,但左转和右转则需要不同的费用。
现在问你,机器人从起点走到终点的最小费用是多少?
机器人的起始方向可以由你指定。注意这是一个四连通的迷宫,即每个格子只与其上下左右的格子相邻,与对角不相邻。起始方向可以选这四种方向的其中一种。
解析:正好前天做过一道和这题差不多但更难一点的题
今天:\(SPFA\) 大水题
前天:\(BFS/SPFA\) + \(DP\)
相信学过最短路的必然秒切
代码
#include<cstdio>
#include<iostream>
using namespace std;
int lcost , rcost , r , c , sx , sy , ex , ey , ans = 1e9;
int dis[105][105][5] , map[105][105] , vis[105][105][105] , head , tail;
int fx[4][2] = { -1 , 0 , 0 , 1 , 1 , 0 , 0 , -1 };
char ch;
struct node{
int x , y , d;
}d[1000005];
inline bool check(int xx , int yy)
{
return (xx > 0 && yy > 0 && xx <= r && yy <= c);
}
inline int spfa(int sd)
{
head = 0 , tail = 0;
d[++tail] = node{sx , sy , sd};
for(register int i = 1; i <= r; i++)
for(register int j = 1; j <= c; j++)
for(register int d = 0; d < 4; d++)
dis[i][j][d] = 1e9 , vis[i][j][d] = 0;
dis[sx][sy][sd] = 0 , vis[sx][sy][sd] = 1;
node now;
int xx , yy , dd;
while (head < tail)
{
now = d[++head] , vis[now.x][now.y][now.d] = 1;
//straight
xx = now.x + fx[now.d][0] , yy = now.y + fx[now.d][1] , dd = now.d;
if (check(xx , yy) && (map[xx][yy] == 0) && (dis[xx][yy][dd] > dis[now.x][now.y][now.d]))
{
dis[xx][yy][dd] = dis[now.x][now.y][now.d];
if (vis[xx][yy][dd] == 0) vis[xx][yy][dd] = 1 , d[++tail] = node{xx , yy , dd};
}
//left
xx = now.x , yy = now.y , dd = (now.d + 3) % 4;
if (map[xx][yy] == 0 && dis[xx][yy][dd] > dis[now.x][now.y][now.d] + lcost)
{
dis[xx][yy][dd] = dis[now.x][now.y][now.d] + lcost;
if (vis[xx][yy][dd] == 0) vis[xx][yy][dd] = 1 , d[++tail] = node{xx , yy , dd};
}
//right
xx = now.x , yy = now.y , dd = (now.d + 1) % 4;
if (map[xx][yy] == 0 && dis[xx][yy][dd] > dis[now.x][now.y][now.d] + rcost)
{
dis[xx][yy][dd] = dis[now.x][now.y][now.d] + rcost;
if (vis[xx][yy][dd] == 0) vis[xx][yy][dd] = 1 , d[++tail] = node{xx , yy , dd};
}
}
int res = 1e9;
for(register int i = 0; i < 4; i++) res = min(res , dis[ex][ey][i]);
return res;
}
int main()
{
scanf("%d%d%d%d%d%d%d%d" , &lcost , &rcost , &r , &c , &sx , &sy , &ex , &ey);
for(register int i = 1; i <= r; i++)
for(register int j = 1; j <= c; j++)
{
ch = getchar();
while (ch != '*' && ch != '.') ch = getchar();
if (ch == '*') map[i][j] = 1;
}
for(register int i = 0; i < 4; i++) ans = min(ans , spfa(i));
printf("%d" , ans == 1e9 ? -1 : ans);
}
\(T4\)
题目大意:\(T\)组数据,给定 \(n\) 个文件,他有文件大小和每秒最大下载量,且只能从 \(s\) 秒开始到 \(t\)秒可以下载
你的电脑有每秒最大下载量,且只能从 \(1\) 秒开始到 \(s\)秒可以下载这些文件
问能否下载完所有文件
解析:改题时,因看到网络流三个字
恍然大悟,脑推了一下,遂得正解
然后码了一波,\(WA\) 了
瞎想一会,才明白题面是错的
所有时间都可以从 \(0\) 秒开始,也就是说你的电脑可以从 \(0\) 就开始下载
好了,纠正完题面,来正解
很容易想到 \(n\) 个文件是节点,时间也是节点,最大下载量就是流量
考虑建边
超级源点 \(S\) 连向每个时间点,流量为电脑每秒最大下载量,实际上就表示你的电脑可以在任意合法时刻内下载文件
每个时间点连向可以再改时间点下载的文件,流量为文件每秒最大下载量,实际上就表示这个时间可以下载文件,且不超过每秒最大下载量
因为前面超级源点 \(S\) 连向每个时间点,所以用在文件的每秒下载量之和不会超过电脑每秒最大下载量
在考虑让所有文件连向超级汇点 \(T\) ,流量为文件大小,表示从此文件下载的大小不会超过文件大小,也就是说不会帮其他文件下载,保证正确性
最后跑最大流,看最大流量是不是能下载完所有文件
套路而巧妙
代码
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n , w , s , S = 119 , T = 120 , INF = 1e9 , h[200] , cur[200] , dep[200] , d[200] , tot;
struct node{
int m , w , c , d;
}a[200];
struct edge{
int to , nxt , v;
}e[100005];
inline void add(int x , int y , int z)
{
e[++tot].to = y , e[tot].nxt = h[x] , e[tot].v = z , h[x] = tot;
}
inline void build()
{
tot = 1;
memset(h , 0 , sizeof(h));
for(register int i = 1; i <= s; i++) add(S , i , w) , add(i , S , 0);
for(register int i = 1; i <= n; i++)
{
add(s + i , T , a[i].m) , add(T , s + i , 0);
for(register int j = a[i].c; j <= a[i].d; j++)
add(j , s + i , a[i].w) , add(s + i , j , 0);
}
}
inline bool bfs()
{
register int head = 0 , tail = 0 , now;
for(register int i = 1; i <= T; i++) cur[i] = h[i] , dep[i] = INF;
d[++tail] = S , dep[S] = 0;
while (head < tail)
{
now = d[++head];
for(register int i = h[now]; i; i = e[i].nxt)
{
register int v = e[i].to;
if (dep[v] == INF && e[i].v > 0) dep[v] = dep[now] + 1 , d[++tail] = v;
}
}
return dep[T] != INF;
}
inline int dfs(int x , int mi , int fa)
{
if (mi <= 0 || x == T) return mi;
register int flow = 0 , f;
for(register int i = cur[x]; i; i = e[i].nxt)
{
cur[x] = i;
register int v = e[i].to;
if (e[i].v > 0 && v != fa && dep[v] == dep[x] + 1)
{
f = dfs(v , min(mi , e[i].v) , x);
if (f > 0) mi -= f , e[i].v -= f , e[i ^ 1].v += f , flow += f;
if (mi <= 0) break;
}
}
return flow;
}
inline int dinic()
{
int Maxflow = 0;
while (bfs()) Maxflow += dfs(S , INF , 0);
return Maxflow;
}
inline bool check(int sum)
{
build();
return dinic() >= sum;
}
int main()
{
// freopen("d.in" , "r" , stdin);
scanf("%d" , &n);
while (n)
{
scanf("%d%d" , &w , &s) , s++;
register int sum = 0;
for(register int i = 1; i <= n; i++)
{
register int m , w , c , d;
scanf("%d%d%d%d" , &m , &w , &c , &d) , sum += m;
a[i] = (node){m , w , c + 1 , d + 1};
}
if (check(sum)) printf("yes\n");
else printf("no\n");
scanf("%d" , &n);
}
}
愉快!!!
JZOJ 2020.01.11【NOIP提高组】模拟B组的更多相关文章
- 2020.02.01【NOIP提高组】模拟B 组总结反思——数列(sequence) 树 【2012东莞市选】时间流逝 挖掘机技术哪家强
T1 数列(sequence) 比赛时 我自以为是地打了简简单单一个判断--- 之后 Waiting-- T2 2753. 树(tree) 比赛时 这题我居然比赛时也想了很久,可能是因为我太懒,我很早 ...
- 【纪中集训】2019.08.01【NOIP提高组】模拟 A 组TJ
T1 Description 给定一个\(N*N(N≤8)\)的矩阵,每一格有一个0~5的颜色.每次可将左上角的格子所在连通块变为一种颜色,求最少操作数. Solution IDA*=启发式迭代加深 ...
- [jzoj 5770]【2018提高组模拟A组8.6】可爱精灵宝贝 (区间dp)
传送门 Description Branimirko是一个对可爱精灵宝贝十分痴迷的玩家.最近,他闲得没事组织了一场捉精灵的游戏.游戏在一条街道上举行,街道上一侧有一排房子,从左到右房子标号由1到n. ...
- JZOJ5857 【NOIP提高组模拟A组2018.9.8】没有上司的舞会
题目 Description "那么真的有果尔德施坦因这样一个人?"他问道. "是啊,有这样一个人,他还活着.至于在哪里,我就不知道了." "那么那个 ...
- 2020牛客NOIP赛前集训营-普及组(第二场)A-面试
面 试 面试 面试 题目描述 牛牛内推了好多人去牛客网参加面试,面试总共分四轮,每轮的面试官都会对面试者的发挥进行评分.评分有 A B C D 四种.如果面试者在四轮中有一次发挥被评为 D,或者两次发 ...
- 2020牛客NOIP赛前集训营-普及组(第二场) 题解
目录 T1 面试 描述 题目描述 输入描述: 输出描述: 题解 代码 T2 纸牌游戏 描述 题目描述 输入描述: 输出描述: 题解 代码 T3 涨薪 描述 题目描述 输入描述: 输出描述: 题解 代码 ...
- 【2020.11.28提高组模拟】T1染色(color)
[2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ...
- JZOJ 5812. 【NOIP提高A组模拟2018.8.14】 区间
5812. [NOIP提高A组模拟2018.8.14] 区间 (File IO): input:range.in output:range.out Time Limits: 1000 ms Memo ...
- 2020.09.12【NOIP提高组&普及组】模拟赛C组 总结
总结:这次比赛成绩并不理想,虽然策略得当 \(P.S.\):太多题有多组数据,但是样例只有一个数据 各题题解和改题情况 T1 匹配 题面 描述 给你一个由{a,b-z,A,B-.Z}组成的字符串,我们 ...
随机推荐
- python将列表中的数字合并成一个数字
前言 今天,写算法题,其中需要进行这一步操作 输入: [1,2,3,4,5] 输出: 12345 解决办法 我首先想到用 join() 函数,但我发现使用join函数要求列表中的元素都是字符串,所以需 ...
- Datawhale组队学习_Task03:详读西瓜书+南瓜书第4章
第4章 决策树 4.1 基本流程 #输入:训练集D={${(x_1,y_1),(x_2,y_2),...,(x_m,y_m)}$}; #属性集A=${{a_1,a_2,...,a_d}}$. #过程: ...
- 常用函数/异常处理/for循环本质
常用内置函数 1,map() - 映射 格式: map(函数,可遍历对象) 指将遍历的元素挨个取出来做函数的行参传参,得到的返回值全部放回map工厂中,map工厂可以被转换成列表查看到 每一个被函数处 ...
- python各种小知识
一.三元表达式 1. 简化步骤1:代码简单且只有一行,可以直接在冒号后面编写 三元表达式: 数据值1+ if 条件+else 数据值2条件成立则使用数据值1,条件不成立则使用数据值2: 当结果是二选一 ...
- MongoDB 强制使用索引 hint
转载请注明出处: 虽然MongoDB 查询优化器一般工作的很不错,但是也可以使用 hint() 来强迫 MongoDB 使用一个特定的索引.在这种方法下某些情形下会提升性能. 一个有索引的 colle ...
- APIO2022 游记
Day 0 有人刚登记完房间就把房卡落在房间里了我不说是谁(真不是我,不信去问jth) 下午把gen把模拟赛的题补了一下,T3是个不太可做的虚树上淀粉质dp,先咕着. Day 1 上午来的比较晚,没有 ...
- 【原创】linux实时应用如何printf输出不影响实时性?
版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100.如有错误,欢迎指正. @ 目录 1. 前言 2. linux终端输出 3. 常见的N ...
- [NOIP2017 普及组]跳房子 【题解】
题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 \(n ...
- java入门与进阶 P-2.7+P-3.1
判断语句常见错误 忘了大括号 永远在if和else后面加上大括号,即使当时后面只有一条语句 if后面的分号 错误使用== 和= if只要求()里面的值是零或者非零 = 是赋值 == 是判断是否相同 代 ...
- 【随笔记】ATECC608 加密芯片调试记录
芯片通信测试 根据芯片手册,ATECC608B 的 7bit 器件地址是:0x35 root@linux:/usr/bin# i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a ...