数据可私信我.

T1 : grid

题目:在一个\(n*n\)的方格中,你只能斜着走。为了让问题更简单,你还有一次上下左右走的机。给你一个起点,和终点,询问从起点到终点的最短路.

输入样例

8 2 3 7 5

输出样例

5


数据范围:

对于 \(20%\) 的数据满足:\(n<=10\)

对于另外 \(30%\) 的数据满足:\(n<=1000\)

对于 \(100%\)的数据满足:\(n<=1e18,s1,t1,s2,t2<=n\)

期望:100

实际得分:100

解:

还是比较不错的画图题.

大概就是先斜着走满max(abs(s1 - s2),abs(t1 - t2))

因为斜着是h ++,l ++么(不管坐标,只管相对位置的话)

所以剩下的分两种情况:

1.偶数

直接斜着来回条就好了

2.奇数

先直接偶数跳,然后动用上下左右走的机会.

CODE

#include <iostream>
#include <cstdio>
#define ll long long ll max(ll a,ll b) {
return a > b ? a : b ;
} ll abs(ll a) {
return a > 0 ? a : -a;
} int main() {
freopen("grid.in","r",stdin);
freopen("grid.out","w",stdout);
ll n,s1,s2,t1,t2,ans;
std::cin >> n >> s1 >> t1 >> s2 >> t2;
ans = max(abs(s1 - s2),abs(t1 - t2));
std::cout << ans;
fclose(stdin);
fclose(stdout);
return 0;
}

T2 : ling

期望:100

实际得分:100

【题目描述】

作为一场 NOIP 良心模拟赛,需要一道小清新字符串题。

xxx 最近在研究语言学(glossology)。他对正在研究的语言有一个疑问。在这门语言中,所有

单词是按照同一方式生成的:首先确定一个基本串(base)(长度至少为 3) ,然后在基本串后加任

意多个(可以不加)长度为 2 或 3 的后缀串(suffix),得到单词s。要求相邻后缀串不能相同。

现在他有一些单词 s, 他想知道, 在基本串任意的情况下, 可能参与构成 s 的后缀串有哪些。

特别的, 对于有些单词, 其相邻后缀串可以相同, 他会用 type 标注 (对于 T 组数据都有效) 。

若 type = 0,则相邻后缀串不能相同;否则相邻后缀串可以相同(type 可以是除 0 外的任

何 int 内的整数) 。

【输入格式】

第一行两个整数 T,type,表示数据组数和后缀串是否有限制(见题目描述) 。

接下来 T 行,每行一个字符串,表示要求的单词 s。

【输出格式】

对于每组数据:

第一行输出k,表示可能构成 s 的后缀串个数。

接下来 k 行,每行输出一个字符串 suf i ,表示一个可能的后缀串。

所有后缀串按字典序从小到大输出。

【样例 1 输入】

2 0

abc

acacaca

【样例 1 输出】

0

2

aca

ca

【样例 1 解释】

对于第一个 s,要求基本串长度至少为 3,所以不存在合法后缀串。

对于第二个 s,有两种情况:acac 做基本串时,合法后缀串有 aca;acaca 做基本串时,合

法后缀串有 ca。即:acacaca 与 acacaca。

【样例 2 输入】

1 0

abcabcabab

【样例 2 输出】

5

ab

bab

bca

ca

cab

【样例 2 解释】

合法的划分为:abcabcabab、abcabcabab、abcabcabab。 (红色为基本串,蓝色、紫色为

后缀串)

【样例 3 输入】

1 1

abcabcabab

【样例 3 输出】

7

ab

abc

bab

bc

bca

ca

cab


数据范围:

对于所有的的测试数据满足 \(T <= 10,\sum |s|<=5e4\)

题解:

考虑DP

f[i][0/1]表示以i为起点的2个字串和三个字串是否可行

状态方程就是:

在满足前后两个字串相等的条件下$$f [i][1] = f[i + 3][0] | f[i + 3][1]$$

在满足前后两个字串相等的条件下$$f[i][0] = f[i + 2][0] | f[i + 2][1]$$

时间复杂度:\(O(n)\)

按字典序的时候比较神奇.因为全是小写字母,可以用\(ok1[28][28],ok2[28][28][28]\)来确定这个字符的出现及输出.

我的方法就是map判断是否可行和string + sort.

非常麻烦

My_CODE

#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <map>
const int maxN = 5e4 + 7;
using namespace std; bool f[maxN][2];//0是后面一个和自己,1是后面两个和自己
string emm,s; //DP string ans[maxN];
int num;
map <string,int> m;
//去重 void init() {
emm.clear();
s.clear();
num = 0;
m.clear();
memset(f,0,sizeof(f));
} void work1() {
cin >> emm;
int len = emm.length();
s = emm;
if(len <= 4) {
puts("0");
return;
}
if(len == 5) {
puts("1");
cout << s[len - 2] << s[len - 1] << '\n';
return ;
}
f[len - 1][0] = true;
f[len - 2][1] = true;
for(int i = len - 3;i > 3;-- i) {
f[i][0] = f[i + 2][1] | f[i + 2][0];
f[i][1] = f[i + 3][0] | f[i + 3][1];
}
for(int i = 1;i <= len;++ i) {
if(f[i][0]) {
string tmp;
for(int j = 0;j <= 1;++ j) {
tmp += s[i + j - 1];
}
if(!m[tmp]) {
ans[++ num] = tmp;
m[tmp] = 1;
}
}
if(f[i][1]) {
string tmp;
for(int j = 0;j <= 2;++ j) {
tmp += s[i + j - 1];
}
if(!m[tmp]) {
ans[++ num] = tmp;
m[tmp] = 1;
}
}
}
printf("%d\n",num);
sort(ans + 1,ans + num + 1);
for(int i = 1;i <= num;++ i) {
cout << ans[i];
puts("");
}
return;
} void work() {
cin >> emm;
int len = emm.length();
s = emm;
if(len <= 4) {
puts("0");
return;
}
if(len == 5) {
puts("1");
cout << s[len - 2] << s[len - 1] << '\n';
return ;
}
f[len - 1][0] = true;
f[len - 2][1] = true;
for(int i = len - 3;i > 3;-- i) {
bool flag1 = false,flag2 = false;
for(int j = 0;j <= 2;++ j) if(s[i + j - 1] != s[i + 3 + j - 1]) flag1 = true;
f[i][0] = f[i + 2][1];
f[i][1] = f[i + 3][0];
if(flag1) f[i][1] = f[i][1] | f[i + 3][1];
for(int j = 0;j <= 1;++ j) if(s[i + j - 1] != s[i + 2 + j - 1]) flag2 = true;
if(flag2) f[i][0] = f[i][0] | f[i + 2][0];
}
for(int i = 1;i <= len;++ i) {
if(f[i][0]) {
string tmp;
for(int j = 0;j <= 1;++ j) {
tmp += s[i + j - 1];
}
if(!m[tmp]) {
ans[++ num] = tmp;
m[tmp] = 1;
}
}
if(f[i][1]) {
string tmp;
for(int j = 0;j <= 2;++ j) {
tmp += s[i + j - 1];
}
if(!m[tmp]) {
ans[++ num] = tmp;
m[tmp] = 1;
}
}
}
printf("%d\n",num);
sort(ans + 1,ans + num + 1);
for(int i = 1;i <= num;++ i) {
cout << ans[i];
puts("");
}
return;
} int main() {
freopen("ling.in","r",stdin);
freopen("ling.out","w",stdout);
int T,type;
scanf("%d%d",&T,&type);
if(!type) {
while(T --) {
init();
work();
}
}
else {
while(T --) {
init();
work1();
}
}
fclose(stdin);
fclose(stdout);
return 0;
}

STD_CODE

#include <cstdio>
#include <cstring>
#include <algorithm>
#define pc putchar
const int N=50005; bool f[N][2]/*0:2 1:3*/,ok2[28][28],ok3[28][28][28];
char s[N]; void Work(const int type)
{
memset(f,0,sizeof f);
memset(ok2,0,sizeof ok2), memset(ok3,0,sizeof ok3); scanf("%s",s+1);
int n=strlen(s+1);
std::reverse(s+1,s+1+n); int tot=0; n-=3;
if(n>=2) f[2][0]=1, ++tot, ok2[s[2]-'a'][s[1]-'a']=1;
if(n>=3) f[3][1]=1, ++tot, ok3[s[3]-'a'][s[2]-'a'][s[1]-'a']=1; for(int i=4; i<=n; ++i)
{
int a=s[i]-'a', b=s[i-1]-'a', c=s[i-2]-'a';
if(f[i-2][1]||(f[i-2][0]&&(type||s[i]!=s[i-2]||s[i-1]!=s[i-3])))
{
f[i][0]=1;
if(!ok2[a][b]) ++tot, ok2[a][b]=1;
}
if(f[i-3][0]||(f[i-3][1]&&(type||s[i]!=s[i-3]||s[i-1]!=s[i-4]||s[i-2]!=s[i-5])))//i>=6
{
f[i][1]=1;
if(!ok3[a][b][c]) ++tot, ok3[a][b][c]=1;
}
}
printf("%d\n",tot);
for(int i=0; i<27&&tot; ++i)
{
for(int j=0; j<27; ++j)
{
if(ok2[i][j]) --tot,pc(i+'a'),pc(j+'a'),pc('\n');
for(int k=0; k<27; ++k)
if(ok3[i][j][k]) --tot,pc(i+'a'),pc(j+'a'),pc(k+'a'),pc('\n');
}
}
} int main()
{
freopen("ling.in","r",stdin);
freopen("ling.out","w",stdout); int T,type;
for(scanf("%d%d",&T,&type); T--; Work(type));
return 0;
}

T3 : threebody

某CF原题.

CF643E.

洛谷:题目链接

非常好的一道题,考场中由于思维太渣,处理T2部分的时候非常麻烦.导致用时太长.没有时间思考这道题,最近在学习期望这一部分,所以打算认真的做一下.

首先要确认这是一个期望DP.

线性性质就不必说了.

设f[x][i]表示以x为根,\(dep[x_{son}] <= h\)的概率

那么答案就是.\(\sum_{h = 1}^{MAX\_H}h * (f[x][h] - f[x][h - 1])\)

考虑如何更新.

显然,可以通过\(x_{son}\)转移,那么子节点\(v = son_x\)有两种情况,一个是存在边,对\(f[x][h]\)贡献\(1/2 * f[v][h - 1]\)的概率,二十不存在该边,概率那么就是\(1/2\)

然后就成了\(f[x][h] = \prod_{v = son_x}(1/2 + 1/2 * f[v][h - 1])\)

更新的时候暴力更新即可,一直往上直到根节点.除掉以前的项,乘上新的项即可.

但是如果深度特别大怎么办,注意题目中的有精度误差,那么到了很大的数就会比\(1e-6\)小,这个时候精度达到了,不用继续.这里选择取\(Max\_H = 60\).

CODE

#include <iostream>
#include <cstdio>
const int maxN = 5e5 + 7;
const int maxH = 60; int n,fa[maxN];
double f[maxN][maxH]; inline int read() {
int x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9' ) {if(c == '-')f = -1;c = getchar();}
while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
return x * f;
} int main() {
int n = 1,T = read(),opt,x;
for(int i = 0;i < maxH;++ i) f[1][i] = 1;
while(T --) {
opt = read();x = read();
if(opt == 1) {
fa[++ n] = x;
for(int i = 0;i < maxH;++ i)
f[n][i] = 1;
double tmp1 = f[x][0],tmp2;
f[x][0] *= 0.5;
for(int Fa = fa[x],i = 1; Fa && i < maxH; Fa = fa[x = Fa],++ i)
{
tmp2 = f[Fa][i];
f[Fa][i] /= 0.5 + 0.5 * tmp1;
f[Fa][i] *= 0.5 + 0.5 * f[x][i-1];
tmp1 = tmp2;
}
}
else {
double ans = 0;
for(int i = 1;i < maxH;++ i)
ans += (f[x][i] - f[x][i - 1]) * i;
printf("%.10lf\n",ans);
}
}
return 0;
}

NOIP 模拟题的更多相关文章

  1. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  4. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  5. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  6. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  7. 9.22 NOIP模拟题

    吉林省信息学奥赛 2017 冬令营                                                                                    ...

  8. 6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

  9. noip模拟题《迷》enc

    [问题背景]zhx 和他的妹子聊天.[问题描述]     考虑一种简单的加密算法.     假定所有句子都由小写英文字母构成, 对于每一个字母, 我们将它唯一地映射到另一个字母.例如考虑映射规则:a- ...

随机推荐

  1. 解决element 照片墙上传时回显问题

    1.先看看样式: <el-upload class="imgList" action="1165165" list-type="picture- ...

  2. cell内存优化

    UITableView的常用属性: 分割线颜色设置: 1> 设置separatorStyle: 分割线的颜色 方法:tableView.separatorStyle = UITableViewC ...

  3. suse 11 sp4 设置yast 安装源

    suse yast 软件管理工具,用户在初始安装系统时,可能会遗漏比较多的库和工具,那么为了方便大家日后可以随时添加,用户可以选择将安装ISO 文件添加到 suse 的yast 安装源上. 用户首先创 ...

  4. Luogu P1514引水入城【搜索】 By cellur925

    题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...

  5. max713镍氢电池充电管理IC

    PDF:https://datasheets.maximintegrated.com/en/ds/MAX713SWEVKIT.pdf http://www.ixueshu.com/document/b ...

  6. E. 打击判定 判断矩形是否相交

    有一个很明显的做法就是判断PointInPolygon .枚举第二个矩形的点,是否在第一个矩形内,但是有bug 就是那种第二个矩形很大的那种,所以容易想到又枚举第一个矩形的点,看是否在第二个矩形里. ...

  7. Hadoop工作流引擎之Azkaban与Oozie对比(四)

    Azkaban是什么?(一) Azkaban的功能特点(二) Azkaban的架构(三) 不多说,直接上干货! http://www.cnblogs.com/zlslch/category/93883 ...

  8. vs2013修改为双击打开文件

    vs2012和vs2013默认是单击打开文件,让人突然就不习惯了,各种不爽. 修改方法: 工具-选项-环境-选项卡和窗口-不勾选允许在预览选项卡中打开新文件.

  9. aspx页面调用webapi接口报错:远程服务器返回错误:(500)内部服务器错误

    代码在运行到response = (HttpWebResponse)request.GetResponse();就开始报错 原因:可能因为所调用的接口不存在或者接口中存在错误,可用postman测试接 ...

  10. How to detect the presence of the Visual C++ 2010 redistributable package

    Question: I have seen your previous blog posts that describe how to detect the presence of the Visua ...