【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实现蓝桥杯VIP算法训练 奇变的字符串
试题 算法训练 奇变的字符串 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 将一个字符串的奇数位(首位为第0位)取出,将其顺序弄反,再放回原字符串的原位置上. 如字符串" ...
- Java实现 LeetCode 238 除自身以外数组的乘积
238. 除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元 ...
- Java实现 LeetCode 130 被围绕的区域
130. 被围绕的区域 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O). 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充. 示例: X X X X X O O ...
- Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
算法提高 阮小二买彩票 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否 ...
- React 为什么要把事件挂载到 document 上 & 事件机制源码分析
前言 我们都知道 React 组件绑定事件的本质是代理到 document 上,然而面试被问到,为什么要这么设计,有什么好处吗? 我知道肯定不会是因为虚拟 DOM 的原因,因为 Vue 的事件就能挂载 ...
- 【JAVA习题十九】利用递归方法求5!。
package erase; public class 用递归法求5的阶乘 { public static void main(String[] args) { // TODO Auto-genera ...
- Hive的压缩存储和简单优化
一.Hive的压缩和存储 1,MapReduce支持的压缩编码 压缩格式 工具 算法 文件扩展名 是否可切分 对应的编码/解码器 DEFLATE 无 DEFLATE .deflate 否 org.ap ...
- 实验二 Linux系统简单文件操作命令
项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接接地址 学号-姓名 17041428-朱槐健 作业学习目标 1.学习在Linux系统终端下进行命令行操作 2.掌 ...
- 带你轻松了解C# Lock 关键字
相信绝大多数.NET玩家和我一样,常常使用Timer这个对象,而在WPF中使用DispatcherTimer的人也是很多,DispatcherTimer是在UI线程跑的.我们的程序中大多数都会充斥很多 ...
- 使用jdk1.8 stream特性对参数名称进行排序
在对外对接的时候,通常会碰到签名方式, 然后签名的时候,要求按照参数名称进行排序. 比如参数为 c=22&a=1, 需要将结果排序为a=1&c=22, 然后再进行别的运算. 可以使用j ...