【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 214 最短回文串
214. 最短回文串 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出 ...
- Java 多线程基础(一)基本概念
Java 多线程基础(一)基本概念 一.并发与并行 1.并发:指两个或多个事件在同一个时间段内发生. 2.并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...
- Spring源码之自动装配
我们使用Spring开发过程中经常会用到Autowired注解注入依赖的bean,这部分也是面试的热点问题之一.今天咱们一起来深入研究下自动注入的背后实现原理.首先上一个例子,如下所示: @RestC ...
- Autoware 标定工具 Calibration Tool Kit 联合标定 Robosense-16 和 ZED 相机!
一.安装 Autoware & ZED 内参标定 & 外参标定准备 之前的这篇文章:Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定! 记录了我用 ...
- win32 socket http 操作
纯wininet 操作http关键代码如下: HINTERNET hNet = ::InternetOpen(_T("Test"), INTERNET_OPEN_TYPE_DIRE ...
- CSS里盒子模型中【margin垂直方向边界叠加】问题及解决方案
边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合. 如果都是正边界,结果的边界宽度是 ...
- hql 转 sql
import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.hql.ast.QueryTranslatorI ...
- C Primer Plus(三)
重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 文件输入/输出 1.fgets函数在读取文件内容时会将换行符读入,但gets不会,fp ...
- Tensorflow从0到1(2)之基础知识
张量 张量是tensorflow中的基本数据结构 # 全零张量 zero_tsr = tf.zeros([row_dim, col_dim]) # 全1张量 ones_tsr = tf.ones([r ...
- GitHub 热点速览 Vol.24:程序员自我增值,优雅赚零花钱
摘要:升职加薪,出任 CTO,迎娶白富美/高帅富,走向人生巅峰是很多人的梦想.在本期的热点速览中你将了解自由作者 Easy 如何优雅赚取零花钱的方法,以及定投改变命运 -- 让时间陪你慢慢变富.说到程 ...