【XJOI】NOIP2020模拟训练题2 总结
得分情况:
估分:
30(T1)+100(T2)+0(T3)=130;
实际:
30(T1)+60(T2)+10(T3)=100; QAQ
是我高看自己了
T1 友好数对:
题意:
如果一个数a能由一个数b旋转得到,那么我们称为友好数对,如12345和45123为友好数对,12345和54321不为友好数对。给出两个正整数L,R,求有多少友好数对,满足L<=a (说实话没看懂后面这什么玩意)
输入格式:
第一行一个整数T,表示数据组数,每组数据两个正整数L,R。
输出格式:
对于每组数据,输出一个整数表示答案。
样例输入:
4
1 9
10 40
100 500
1111 2222
样例输出:
0
3
156
287
数据范围:
对于30%的数据满足L,R<=1000
对于100%的数据满足L,R<=2000000,T<=30,L,R位数相同。
大概理解为: 一个数a 把a分为两段 两段长度不能为零 然后把这两段交换位置得到b 要求L<=a,b<=R且a!=b 然后求有多少对这样的数
列如 : a=12345,把a分成123、45两段 , 然后交换得45、123 , 粘起来就成了b=45123;
分析:
看一下数据范围 L,R<=2*1e6,T<=30;
大概算一下2*1e6*30=6*1e7 暴力枚举完全搞得定
因为一个数可能旋转成同一个数多次(比如 232323 )所以要判一下重
只需要把每个数的旋转方式都来一遍 ,再判一下重,就搞定了 (没判重所以来了三十分)
上代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring> using namespace std; bool st[];//判重用的 int main()
{ int T;
scanf("%d",&T);
while(T--)
{
int a,b,res=,t[],rec[]; memset(st,false,sizeof(st)); scanf("%d%d",&a,&b); for(int i=a;i<=b;i++)
{ int cnt=,l=a,p=; while(l)//看一下有多少位 下面分段用
{
l/=;
cnt*=;
} for(int j=;j<cnt;j*=)//枚举从哪一位分段
{ int k=i%j*(cnt/j)+i/j; if(k>=a&&k<i)
{
if(st[k]) continue;//已经有了就不加了
rec[p++]=k;
st[k]=true;
res++;
}
} for(int j=;j<p;j++) st[rec[j]]=false;//把刚刚判的重弄回去
} printf("%d\n",res);
}
}
搞定
T2 路径数:
题意:
Euphemia到一个N*N的药草田里采药,她从左上角的格子田(第一行,第一列)出发,要到达右下角(第N行,第N列)的格子田,每次她可以走到与当前格子有边相邻的格子去,但她不会走已经走过的格子,而且出于对美的要求,她走过的路径是关 于 左下-右上 对角线对称的。由于地势不同,在每个格子田采药都会有一个疲劳度Tij,Euphemia想知道:有多少条合法路径,可以使得她采药的疲劳度最小。
输入格式:
多组数据。
每组数据第一行一个整数N,接下来N行,每行N个非零数字(1,2,3...9中一个),表示格子田的疲劳度。
当N=0,输入结束。
输出格式:
对于每组数据,输出一个整数表示答案,答案%1000000009。
样例输入:
2
1 1
1 1
3
1 1 1
1 1 1
2 1 1
0
样例输出:
2
3
数据范围:
对于20%的数据满足N<=5。
对于另外20%的数据满足N<=40。
对于100%的数据满足N<=100,不超过50组数据。
大概理解为: 从左上角走到右下角的最短路径方案数,但题目有个路径关于 左下-右上 对角线对称,大概理解为这样

我画的好丑
分析:
这个题看出来是单源最短路,N有点大,所以就用堆优化的Dijkstra了 然而我竟然用dp来做,才得60
因为有个对称,所以我们只需要把对角线以下的权值全部对称加到对角线以上,再从左上角走到对角线就OK了
上代码:
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std; const int N=;
const int mod=; long long dis[N][N];
int t[N][N],db[N][N];
int n;
bool book[N][N]; struct sik
{
int x,y,w;//坐标 权值
bool operator< (const sik & f) const//重载运算符 使优先队列为小根堆
{
return w>f.w;
}
}; int Dijkstra()
{
int zx[]={,,,-},zy[]={,,-,};//走的方位 memset(dis,0x3f,sizeof(dis));//一堆初始化
memset(db,,sizeof(db));
memset(book,false,sizeof(book));
int res=,Min=0x3f3f3f3f; priority_queue<sik> que;//优先队列 sik qu; dis[][]=t[][];
db[][]=; qu.x=,qu.y=,qu.w=t[][];
que.push(qu); //把起点放进去 while(que.size())
{
sik c=que.top();
que.pop();
int x=c.x,y=c.y; if(dis[x][y]<=Min&&x+y==n+) //到终点了
{
if(dis[x][y]==Min) res+=db[x][y];
else
{
res=db[x][y]; Min=dis[x][y];
} } if(book[x][y]) continue;//当前点走过了 pass掉
book[x][y]=false; for(int i=;i<;i++)
{
int x1=x+zx[i],y1=y+zy[i]; if(book[x1][y1]||!x1||x1>n||!y1||y1>n) continue; if(dis[x1][y1]>dis[x][y]+t[x1][y1])
{
dis[x1][y1]=dis[x][y]+t[x1][y1];
db[x1][y1]=db[x][y]; sik o;
o.x=x1 , o.y=y1 , o.w=dis[x1][y1];//把当前这个点存进去
que.push(o);
}
else if(dis[x1][y1]==dis[x][y]+t[x1][y1])
{
db[x1][y1]+=db[x][y];
}
}
}
return res;
} int main()
{
while(true)
{
memset(t,,sizeof(t));
scanf("%d",&n);
if(!n) return ;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&t[i][j]); }
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n-i;j++)
{
t[i][j]+=t[n-j+][n-i+];//把对角线以下的加上去 }
} printf("%d\n",Dijkstra());
}
return ;
}
搞定
T3 :
不会
~END~
【XJOI】NOIP2020模拟训练题2 总结的更多相关文章
- XJOI CSP-S2 2019开放模拟训练题1 赛后总结
比赛链接 友好数对 暴力枚举\([L,R]\)之间的所有数,将每个数进行"旋转",看是否符合题意. 注意"旋转"的次数,并不一定是数字位数.只要旋转回到了初始数 ...
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [XJOI NOI2015模拟题13] B 最小公倍数 【找规律】
题目链接:XJOI - NOI2015-13 - B 题目分析 通过神奇的观察+打表+猜测,有以下规律和性质: 1) 删除的 n 个数就是 1~n. 2) 当 c = 2 时,如果 n + 1 是偶数 ...
- [XJOI NOI2015模拟题13] A 神奇的矩阵 【分块】
题目链接:XJOI NOI2015-13 A 题目分析 首先,题目定义的这种矩阵有一个神奇的性质,第 4 行与第 2 行相同,于是第 5 行也就与第 3 行相同,后面的也是一样. 因此矩阵可以看做只有 ...
- [XJOI NOI02015训练题7] B 线线线 【二分】
题目链接:XJOI - NOI2015-07 - B 题目分析 题意:过一个点 P 的所有直线,与点集 Q 的最小距离是多少?一条直线与点集的距离定义为点集中每个点与直线距离的最大值. 题解:二分答案 ...
- XJOI NOIP模拟题2
第一题 组合计数 分析: 从前往后一位一位的计算 先算第一位比t小的数目,再算第一位与t[1]相同,第2位比t小的个数以此类推 先预处理一个数组h,h[i]表示从1~it串与s串不同的位数 对于第i位 ...
- XJOI NOIP模拟题1
第一题 分析: 开始想的是贪心,取每列均值最大一段. 应该是01分数规划,具体看代码 代码: program gold; var a:..]of int64; n,i,m,j,x:longint; f ...
- CSP-S 2020模拟训练题1-信友队T1 四平方和
题意简述 \(n\)是正整数,其四个最小的因子分别为\(d_1,d_2,d_3,d_4\). 求对于所有的\(n \le m\)满足 \[d_1^2+d_2^2+d_3^2+d_4^2=n \] 的\ ...
- CSP-S 2020全国开放赛前冲刺模拟训练题1 T4 二维码
组合 首先可以考虑一个状态合法的条件,可以发现的是最后得到的矩阵一定是至少有一行或是有一列全$0$或$1$,如果把这一列或这一行删掉那么将剩下的子矩阵拼接起来又是一个子问题,同样的也是至少有一列或一行 ...
随机推荐
- Java实现 LeetCode 100 相同的树
100. 相同的树 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [ ...
- IOS App如何调用python后端服务
本篇文章旨在通过一个小的Demo形式来了解ios app是如何调用python后端服务的,以便我们在今后的工作中可以清晰的明白ios app与后端服务之间是如何实现交互的,今天的示例是拿登录功能做一个 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- C语言-耶稣门徒
<span style="font-family: Arial, Helvetica, sans-serif;"> </span> <span sty ...
- Debian安装无线网卡Ralink RL5390驱动
惠普一体机用的无线网卡是Ralink的 RL5390,安装Debian10以后没有驱动,网上下载firmware-misc-nonfree_20190114-2_all.deb 和firmware-r ...
- MATLAB读取和保存nifti文件
介绍 分析核磁数据时,数据的读取和保存是两个基本的操作.虽然大部分工具包都对这些功能进行了封装,但是如果你不了解如何使用这些工具包或者说当前的任务太简单不值得去使用这些庞大的工具包的时候就需要我们自己 ...
- flink实时数仓从入门到实战
第一章.flink实时数仓入门 一.依赖 <!--Licensed to the Apache Software Foundation (ASF) under oneor more contri ...
- HotCorner-让Windows 10拥有macOS的触发角特性!
目录 简介 软件功能 下载 安装 卸载 使用 License 作者 FAQ 简介 macOS上有一个很方便的功能:"触发角".通过这个功能可以设置当鼠标移动到屏幕的四个角时的触发事 ...
- 小师妹学JVM之:JDK14中JVM的性能优化
目录 简介 String压缩 分层编译(Tiered Compilation) Code Cache分层 新的JIT编译器Graal 前置编译 压缩对象指针 Zero-Based 压缩指针 Escap ...
- 0xC0000005: Access Violation -vc++6.0
0xC0000005: Access Violation -vc++6.0 aps001,002,003创建的C:\SMW200DATA\DATA,内容是不一样的,不通用的.读取相关文件就会报错咯. ...