SX【2020.01.09】NOIP提高组模拟赛(day1)
【2020.01.09】NOIP提高组模拟赛(day1)
这次考得不理想,只做了前两题,后两题没时间做,说明做题速度偏慢。
source : 100 + 20 + 0 + 0 = 120 rank7
十分不友好。
算了,进入正题
\(T1\)
传送门:[USACO17JAN]Cow Dance Show奶牛舞蹈
分析
一道清新的水题,很容易想到二分答案,易证满足单调性。
然后考虑可以接受的 \(check\)
根据时间维护一个小根堆,取堆首时判断。
然后——切了
代码略
\(T2\)
传送门:[USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…
一道本应该是没多难的 \(DP\) ,然而考场时漏考虑一种转移,直接炸到 \(20\) 分。
根据题意,容易想到设状态 \(f_{i,j,k}\) 表示到第 \(i\) 回合,有改变 \(j\) 次的机会,且当前出 \(k\) (H/S/P,设为 \(1/2/3\) )
考虑转移:
设 \(p\) ,\(q\) 表示不同于 \(k\) 的另外两个手势,\(win[i][j]\) 表示手势 \(i\) 能赢手势 \(j\) ,\(a[i]\) 表示当前 \(FJ\) 的手势 则有:
\]
代码
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1e5;
int n , k , a[N + 5] , f[N + 5][25][4] , ans = 0 , p , q;
char ch;
int data[4][4];
int main()
{
// freopen("hps.in" , "r" , stdin);
// freopen("hps.out" , "w" , stdout);
scanf("%d%d" , &n , &k);
for(register int i = 1; i <= n; i++)
{
ch = getchar();
while (ch != 'H' && ch != 'P' && ch != 'S') ch = getchar();
if (ch == 'H') a[i] = 1;
else if (ch == 'P') a[i] = 2;
else if (ch == 'S') a[i] = 3;
}
data[1][3] = data[2][1] = data[3][2] = 1;
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= 3; j++)
f[i][0][j] = f[i - 1][0][j] + data[j][a[i]];
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= k; j++)
for(register int l = 1; l <= 3; l++)
{
if (l == 1) p = 2 , q = 3;
else if (l == 2) p = 1 , q = 3;
else if (l == 3) p = 1 , q = 2;
f[i][j][l] = max(f[i - 1][j][l] + data[l][a[i]], max(f[i - 1][j - 1][p] + data[l][a[i]] , f[i - 1][j - 1][q] + data[l][a[i]]));
}
for(register int i = 0; i <= k; i++)
for(register int j = 1; j <= 3; j++)
ans = max(f[n][i][j] , ans);
printf("%d" , ans);
}
没了······
\(T3\)
传送门:[USACO17JAN]Cow Navigation奶牛导航
一道不是很难但码量大,细节多的题
\(tag\):用 \(BFS\) 模拟做 \(DP\)
详细解析如下:
先转化:因为读入的地图缘故,所以我们设起点 \((n,1)\),终点 \((1,n)\)
有两头奶牛,分别在 \((n,1)\) 处面向两个方向
且要注意:到终点的奶牛无视任何新增命令,不管另一头牛怎样,他都不动;若当前指令有一头牛会越界,也不动。(详细认真看题目)
设 \(f_{x1,y1,d1,x2,y2,d2}\) 表示牛一到达 \((x1,y1)\) 面向 \(d1\) ,牛二到达 \((x2,y2)\) 面向 \(d2\) 时的指令最短长度
因指令每个对答案的贡献都是 \(1\) ,所以可以用 \(BFS\) 来做最短路 ,边扩展边更新 \(dis\)
但实际上可以优化空间,那就是弄掉 \(d2\) 那一维
很好想,因为两头牛接受同一个指令,他们的方向是相对的,知道其中一头,就能知道另一头,取决于一开始的朝向
代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N = 20;
int n , map[N + 5][N + 5] , head , tail , ans = 1e5;
int f[N + 5][N + 5][4][N + 5][N + 5][4] , vis[N + 5][N + 5][4][N + 5][N + 5][4];
int fx[4][2] = { -1 , 0 , 0 , 1 , 1 , 0 , 0 , -1 };
char ch;
struct node{
int x1 , y1 , d1 , x2 , y2 , d2;
}q[N * N * N * N * 16 + 10];
inline bool check(int x , int y , int xx , int yy)
{
return (x <= 0 || y <= 0 || x > n || y > n || map[x][y] == 1 || (xx == 1 && yy == n));
}
int main()
{
// freopen("cow.in" , "r" , stdin);
// freopen("cow.out" , "w" , stdout);
scanf("%d" , &n);
for(register int i = 1; i <= n; i++)
for(register int j = 1; j <= n; j++)
{
while (ch != 'E' && ch != 'H') ch = getchar();
if (ch == 'H') map[i][j] = 1;
ch = getchar();
}
q[++tail] = (node){n , 1 , 0 , n , 1 , 1};
memset(f , 0x3f , sizeof(f));
f[n][1][0][n][1][1] = 0;
vis[n][1][0][n][1][1] = 1;
while (head < tail)
{
struct node now = q[++head];
int x1 , y1 , d1 , x2 , y2 , d2;
d1 = now.d1 , d2 = now.d2;
x1 = now.x1 + fx[d1][0] , y1 = now.y1 + fx[d1][1];
if (check(x1 , y1 , now.x1 , now.y1)) x1 = now.x1 , y1 = now.y1;
x2 = now.x2 + fx[d2][0] , y2 = now.y2 + fx[d2][1];
if (check(x2 , y2 , now.x2 , now.y2)) x2 = now.x2 , y2 = now.y2;
if (f[now.x1][now.y1][now.d1][now.x2][now.y2][now.d2] + 1 < f[x1][y1][d1][x2][y2][d2] && vis[x1][y1][d1][x2][y2][d2] == 0)
{
q[++tail] = (node){x1 , y1 , d1 , x2 , y2 , d2};
f[x1][y1][d1][x2][y2][d2] = f[now.x1][now.y1][now.d1][now.x2][now.y2][now.d2] + 1;
vis[x1][y1][d1][x2][y2][d2] = 1;
}
d1 = (now.d1 + 1) % 4 , d2 = (now.d2 + 1) % 4;
x1 = now.x1 , y1 = now.y1 , x2 = now.x2 , y2 = now.y2;
if (f[now.x1][now.y1][now.d1][now.x2][now.y2][now.d2] + 1 < f[x1][y1][d1][x2][y2][d2] && vis[x1][y1][d1][x2][y2][d2] == 0)
{
q[++tail] = (node){x1 , y1 , d1 , x2 , y2 , d2};
f[x1][y1][d1][x2][y2][d2] = f[now.x1][now.y1][now.d1][now.x2][now.y2][now.d2] + 1;
vis[x1][y1][d1][x2][y2][d2] = 1;
}
d1 = (now.d1 + 3) % 4 , d2 = (now.d2 + 3) % 4;
x1 = now.x1 , y1 = now.y1 , x2 = now.x2 , y2 = now.y2;
if (f[now.x1][now.y1][now.d1][now.x2][now.y2][now.d2] + 1 < f[x1][y1][d1][x2][y2][d2] && vis[x1][y1][d1][x2][y2][d2] == 0)
{
q[++tail] = (node){x1 , y1 , d1 , x2 , y2 , d2};
f[x1][y1][d1][x2][y2][d2] = f[now.x1][now.y1][now.d1][now.x2][now.y2][now.d2] + 1;
vis[x1][y1][d1][x2][y2][d2] = 1;
}
}
for(register int i = 0; i < 4; i++)
for(register int j = 0; j < 4; j++)
ans = min(ans , f[1][n][i][1][n][j]);
printf("%d" , ans);
}
\(T4\)
传送门:[USACO17JAN]Subsequence Reversal序列反转
解析如下:
似乎无从下手的题,其实是个很套路的区间 \(DP\)
根据数值只有 \(1~50\) 的特性,我们可以用神奇的操作弄掉所谓的翻转
废话不多说,且看
设 \(f_{i,j,down,up}\) 表示区间 \([i,j]\) ,数值取值范围 \([down,up]\) 时的最长子序列长度
然后区间 \(DP\) 套路转移,但两个区间是套在一起转移的
代码
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 50;
int n , f[N + 5][N + 5][N + 5][N + 5] , a[N + 5] , Mx;
int main()
{
// freopen("reversal.in" , "r" , stdin);
// freopen("reversal.out" , "w" , stdout);
scanf("%d" , &n);
for(register int i = 1; i <= n; i++)
{
scanf("%d" , &a[i]);
for(register int down = 1; down <= a[i]; down++)
for(register int up = a[i]; up <= 50; up++)
f[i][i][down][up] = 1;
}
for(register int len1 = 2; len1 <= n; len1++)
for(register int i = 1; i <= n - len1 + 1; i++)
{
register int j = i + len1 - 1;
for(register int len2 = 2; len2 <= 50; len2++)
for(register int down = 1; down <= 51 - len2; down++)
{
register int up = down + len2 - 1 , Mx;
Mx = max(f[i][j][down + 1][up] , f[i][j][down][up - 1]);
Mx = max(f[i + 1][j][down][up] + (a[i] == down) , Mx);
Mx = max(f[i][j - 1][down][up] + (a[j] == up) , Mx);
Mx = max(f[i + 1][j - 1][down][up] + (a[j] == down) + (a[i] == up) , Mx);
f[i][j][down][up] = Mx;
}
}
printf("%d" , f[1][n][1][50]);
}
SX【2020.01.09】NOIP提高组模拟赛(day1)的更多相关文章
- 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】
U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...
- [LUOGU] NOIP提高组模拟赛Day1
题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...
- HGOI2010816 (NOIP 提高组模拟赛 day1)
Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts) 100+70+40=210 rank 29 这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Has ...
- 洛谷 NOIP提高组模拟赛 Day1
传送门 ## $T1$ 一道结论题,设原来A队能力最大的是x,那么A队的选择方案就是$2^{x-1}$,B队的选择方案就是$(2^{n-x}-1)$种,因为不能不选.其中$1\leq x\leq n$ ...
- 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...
- 10-18 noip提高组模拟赛(codecomb)T2贪心
T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...
- HGOI20180815 (NOIP 提高组模拟赛 day2)
Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- noip提高组模拟赛(QBXT)T2
T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ...
- newcoder NOIP提高组模拟赛C题——保护
我是发了疯才来写这道题的 我如果用写这道题的时间去写dp,我估计我能写上三四道 可怕的数据结构题 题目 这道题的鬼畜之处在于实在是不太好写 我们看到要求离树根尽量的近,所以我们很容易就能想到树上倍增, ...
随机推荐
- mysql-front连接mysql报错1251解决方法
客户端不通过服务器的验证,建议升级mysql客户端 出现错误的原因是mysql版本问题,由于mysql8.0版本与mysql5.0版本加密方式不同,导致mysql-front无法通过验证. mysql ...
- Maven工程卡在Resolving Maven dependencies,长时间不变
添加:-Xms1024m -Xmx2048m 点apply.ok 秒解决
- Jmeter 之吞吐量控制器
作用: 吞吐量控制器可用来模拟混合场景的压测业务,即一部分用户执行场景A,一部分用户执行场景B 字段说明: Total Excutions:执行请求总数 Percent Excutions:执行线程数 ...
- python 之定时任务(schedule)
import schedule import time def job(): print("定时通报...") # 定义一个叫job的函数,函数的功能是打印'定时通报...' sc ...
- MAUI新生4.6-主题设置LightTheme&DarkTheme
通过主题设置,可以在运行时更改应用的主题外观,比如切换亮色主题和暗黑主题.主题设置并没有新的知识点,基本的原理如下: 定义每个应用主题的ResourceDictionary,每个ResourceDic ...
- “喜提”一个P2级故障—CMSGC太频繁,你知道这是什么鬼?
大家好,我是陶朱公Boy. 背景 今天跟大家分享一个前几天在线上碰到的一个GC故障- "CMSGC太频繁". 不知道大家看到这条告警内容后,是什么感触?我当时是一脸懵逼的,一万个为 ...
- NOIP2022 退役记
无所谓,我还能卡队线. 无所谓,我还能被卡校线.
- SQLSERVER 的主键索引真的是物理有序吗?
一:背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化,书中说当一个表创建了聚集索引,那么表中的行会按照主键索引的顺序物理排列,这里有一个关键词叫:物理排列,如果不了解底层原理 ...
- Springboot整合策略模式概念->使用场景->优缺点->企业级实战
一.前言 策略模式可能是在工作中使用最多的,也是在面试中最常提到的,代码重构和优化的必备! 小编之前也是一直说,其实没有真正的实战:最近有了机会实战了一下,来分享一下使用心得和在企业级的使用! 二.策 ...
- Web初级——JavaScript
JavaScript JavaScript是一种基于对象的脚本语言,用于开发基于客户端和基于服务器的Internet应用程序 1.了解JS 1.1JavaScript的组成 JavaScript 的核 ...