[JZOJ NOIP2018模拟10.20 B组]
T1:原根(math)
题目链接:
http://172.16.0.132/senior/#contest/show/2532/0
题目:
题解:
一个数m原根的个数是$\phi{(\phi{(m)})}$,这个了解一下
其实就是先算出m的欧拉函数值,再从1开始枚举,符合上述定义的就直接输出就好了
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std; int M,phi,m;
int gcd(int a,int b){if (!b) return a;else return gcd(b,a%b);}
int main()
{
//freopen("math.in","r",stdin);
//freopen("math.out","w",stdout);
scanf("%d",&M);
//if (M==1) {puts("1");return 0;}
m=phi=M;
for (int i=;i*i<=m;i++)
{
if (m%i) continue;
phi=phi*(i-)/i;
while (m%i==) m/=i;
}
if (m>) phi=phi*(m-)/m;
m=M;
for (int i=;i<=m;i++)
{
if (gcd(i,m)!=) continue;
int re=;bool fg=;
for (int j=;j<phi;j++)
{
re=1ll*re*i%m;
if (re==) {fg=;break;}
}
if (!fg) continue;
re=1ll*re*i%m;
if (re==) printf("%d\n",i);
}
return ;
}
T2:道路覆盖(cover)
题目链接:
http://172.16.0.132/senior/#contest/show/2532/1
题目:
ar把一段凹凸不平的路分成了高度不同的N段,并用H[i]表示第i段高度。现在Tar一共有n种泥土可用,它们都能覆盖给定的连续的k个部分。
对于第i种泥土,它的价格为C[i],可以使得区间[i,min(n,i+k-1)] 的路段的高度增加E[i]。
Tar要设定一种泥土使用计划,使得使用若干泥土后,这条路最低的高度尽量高,并且这个计划必须满足以下两点要求:
(1)每种泥土只能使用一次。
(2)泥土使用成本必须小于等于M。
请求出这个最低的高度最高是多少。
题解:
我们二分这个高度
发现一个位置的高度仅有它本身的高度和从这个点开始向前$k$个位置是否用泥土有关
我们可以预处理出对于一个位置$i$向前$k$个位置放不放泥土的状态对第$i$个位置高度的贡献
怎么判断当前答案是否可行呢?我们状压
$dp[i][S]$表示前$i$位全部满足大于等于当前二分的值,向前k位的状态为$S$的最小代价,显然存在$dp[n][S]<=m$则当前答案可行
考虑如何转移
if (h[i+]+sum[i+][j>>]>=now) chkmin(dp[i+][j>>],dp[i][j]);
if (h[i+]+sum[i+][(j>>)|(<<(k-))]>=now) chkmin(dp[i+][j>>|(<<(k-))],dp[i][j]+c[i+]);
有一点小细节注意一下就好
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std; const int N=+;
const int K=;
int n,m,k,S;
int h[N],e[N],c[N],sum[N][<<K],dp[N][<<K];
inline int read(){
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void chkmin(int &a,int b){if (b<a) a=b;}
bool check(int now){
memset(dp,0x3f,sizeof(dp));
dp[][]=;
for (int i=;i<n;i++)
{
for (int j=;j<S;j++)
{
if (dp[i][j]>m) continue;
if (h[i+]+sum[i+][j>>]>=now) chkmin(dp[i+][j>>],dp[i][j]);
if (h[i+]+sum[i+][(j>>)|(<<(k-))]>=now) chkmin(dp[i+][j>>|(<<(k-))],dp[i][j]+c[i+]);
}
}
for (int j=;j<S;j++)
{
if (dp[n][j]<=m) return ;
}
return ;
}
int main(){
freopen("cover.in","r",stdin);
freopen("cover.out","w",stdout);
n=read();m=read();k=read();
for (int i=;i<=n;i++){
h[i]=read();e[i]=read();c[i]=read();
}
S=<<k;
for (int i=;i<=n;i++)
for (int j=;j<S;j++)
for (int p=;p<k;p++) if (!(j&(<<p))&&i-(k-p)>=) sum[i][j^(<<p)]+=e[i-(k-p)+];
int l=,r=1e9;int ans;
while (l<=r)
{
int mid=l+r>>;
if (check(mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}
T3:迷宫花园(maze)
题目链接:
http://172.16.0.132/senior/#contest/show/2532/2
题目:
给定一个一定存在从起点到终点的路径的四联通迷宫。已知Tar左右方向移动的时间为1,上下移动的时间为未知实数v。求当Tar从起点到终点的最短移动时间为已知实数L时,未知实数v是多少。
题解:
显然随着v的增大最短移动时间不会变短,那么我们就可以二分。二分出v之后跑spfa判断最短路是否大于等于len,若成立则$r=mid$,否则$l=mid$
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
#define tt calc(fx,fy)
using namespace std;
typedef double db; const int N=;
const db eps=1e-;
const db inf=1e9;
int T,n,m,stx,sty,edx,edy;
db len;
int mp[N][N],vis[N*N];
db dist[N*N];
int calc(int x,int y){return (x-)*m+y;}
bool check(int x,int y) {return x>=&&x<=n&&y>=&&y<=m&&!mp[x][y];}
db spfa(db val){
queue<int> q;
for (int i=;i<=n*m;i++) vis[i]=,dist[i]=inf;
int st=calc(stx,sty);
vis[st]=;q.push(st);dist[st]=;
while (!q.empty()){
int k=q.front();q.pop();vis[k]=;
int x=k/m+,y=k%m;
if (!y) y=m;
int fx,fy;
fx=x-;fy=y;
if (check(fx,fy)&&dist[tt]>dist[k]+val){
dist[tt]=dist[k]+val;
if (!vis[tt]) q.push(tt),vis[tt]=;
}
fx=x+;fy=y;
if (check(fx,fy)&&dist[tt]>dist[k]+val){
dist[tt]=dist[k]+val;
if (!vis[tt]) q.push(tt),vis[tt]=;
}
fx=x;fy=y-;
if (check(fx,fy)&&dist[tt]>dist[k]+){
dist[tt]=dist[k]+;
if (!vis[tt]) q.push(tt),vis[tt]=;
}
fx=x;fy=y+;
if (check(fx,fy)&&dist[tt]>dist[k]+){
dist[tt]=dist[k]+;
if (!vis[tt]) q.push(tt),vis[tt]=;
}
}
return dist[calc(edx,edy)];
}
int main(){
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
scanf("%d",&T);
while (T--){
scanf("%lf%d%d",&len,&n,&m);
for (int i=;i<=n;i++){
char ch=getchar();
while (!(ch=='S'||ch=='E'||ch=='#'||ch==' ')) ch=getchar();
for (int j=;j<=m;j++)
{
if (ch=='#') mp[i][j]=;
else {
mp[i][j]=;
if (ch=='S') stx=i,sty=j;
if (ch=='E') edx=i,edy=j;
}
ch=getchar();
}
}
db l=,r=;
while (r-l>eps){
db mid=(r+l)/;
if (spfa(mid)>=len) r=mid;
else l=mid;
}
printf("%.5lf\n",l);
}
return ;
}
[JZOJ NOIP2018模拟10.20 B组]的更多相关文章
- [JZOJ NOIP2018模拟10.20 A组]
由于T3数据出锅,还不清楚自己的分数...估分150,前100已经拿到了,T3的50没拍过(写的就是暴力怎么拍),感觉很不稳 考试的时候就是特别的困,大概是因为早上在房间里腐败...腐败完了才睡觉 T ...
- [jzoj NOIP2018模拟10.29]
OI生涯的最高分,来了纪中这么多天,在经历了这么多场“NOIP难度”的模拟赛之后,终于看到了真正的NOIP 今天考场上效率很高,很快码完了全部的题目,留下了足够的时间对拍和...发呆.不得不说看着电脑 ...
- [JZOJ NOIP2018模拟10.21]
考试之前我刚刚领略到了特判的重要性,没想到T2的两个子任务还是写挂了,丢了20分 考试的感觉不行,一路打的都是暴力,正解的思路想到一半就断了推不下去 T1:逛公园 题目链接: https://jzoj ...
- [jzoj NOIP2018模拟10.23]
丢分主要是下面几个方面: 1.T2代码交错了,有个特判没写丢了10分 2.T1线段树加等差数列写错了(其实二维差分就可以,但我当时不会) 3.T3思考再三还是为了10分写上了主席树,还是写错了 总体评 ...
- [JZOJ NOIP2018模拟10.19]
T1写炸了今天,期望70却落了个20...连链上的都没有写对 T3什么什么线段树分治套AC自动机,表示我完全自闭了,幸好考场上没有杠T3 总体比赛还是比较舒服,暴力分给的蛮足的,不像昨天那样 T1:林 ...
- JZOJ5918【NOIP2018模拟10.20】Car
题目 最近比较懒,题目描述都直接截图了. 题目大意 给你一棵树,还有树上的几条路径,一条路径上的点到路径上其它任意点的代价为111.然后是一堆询问,问从一个点到另一个点的最小代价. 思路 一开始做这题 ...
- [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...
- [JZOJ 5893] [NOIP2018模拟10.4] 括号序列 解题报告 (Hash+栈+map)
题目链接: https://jzoj.net/senior/#main/show/5893 题目: 题解: 考虑暴力怎么做,我们枚举左端点,维护一个栈,依次加入元素,与栈顶元素和栈内第二个元素相同时弹 ...
- [JZOJ 5912] [NOIP2018模拟10.18] VanUSee 解题报告 (KMP+博弈)
题目链接: https://jzoj.net/senior/#contest/show/2530/2 题目: 众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼 ...
随机推荐
- Oracle在Linux下的性能优化
Oracle数据库内存参数的优化 Ø 与oracle相关的系统内核参数 Ø SGA.PGA参数设置 Oracle下磁盘存储性能优化 Ø 文件系统的选择(ext2 ...
- Java语言的优点
1)Java为纯面向对象的语言. <Thinking in Java>提到Java语言是一种“Everything is object”的语言,它能够直接反应现实生活中的对象, 例如火车, ...
- 「JavaSE 重新出发」05.03 反射
能够分析类能力的程序称为反射(reflection). 反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵 Java 代码的程序. 反射机制可以用 ...
- 『转』Writing Well
这是前辈Julie Zhuo的最新关于写作的文章,昨天写下-进行总结和阅读思考 这是一篇关于提笔写作的文章,首发在The looking glass...前辈每周都会回答一个读者的问题耶--This ...
- day06-2 基本运算符(解压缩)
目录 运算符 算数运算符 比较运算符 赋值运算符 逻辑运算符 运算规则 成员运算符 身份运算符 Python运算符优先级 链式赋值(必考) 交叉赋值(必考) 解压缩(必考) 运算符 算数运算符 进行算 ...
- 搭建hadoop、hdfs环境--ubuntu(完全分布式)
最近在学习hadoop相关知识,就在本机上安装了hadoop,遇到了一些坑,也学到了不少.仅此记录我的安装过程,及可能遇到的问题.供参考.交流沟通见页末. 软件准备 > 虚拟机(VMware) ...
- Ubuntu_18.04安装网易云音乐
首先到网易云音乐官网下载网易云音乐,ubuntu版的,安装. 这时候的图标打不开,缺少libcanberra sudo apt install libcanberra-gtk-module 安装完了配 ...
- 2、Attentive Group Recommendation----注意力集中的群组推荐
1.摘要: 采用attention和NCF结合解决群组偏好融合的问题. 贡献: 第一个使用神经网络学习融合策略的组推荐. 进一步整合用户-项目交互改进组推荐,减轻冷启动问题. 2.方法: 模型AGRE ...
- eclipse集成ijkplayer项目
1.ijkplayer是什么 ijkplayer是b站开源的一个视频插件,基于ffmpeg, 支持 Android 和 iOS,可以代替android自带的videview,有不错的体验,支持的视频文 ...
- google浏览器安装接口测试工具postman方法
Google安装postman: 未配好的文件下载(点击选择下面配好的直接用):下载 配置方法: 一:需要修改postman安装包中js/requester.js 和runner.js ,将其中的ai ...