当前位置: 首页 > news >正文

2024ccpc郑州(LMFB)

题目链接:第十届中国大学生程序设计竞赛 郑州站(CCPC 2024 Zhengzhou Site) - 比赛主页 - 比赛 - QOJ.ac

L. Z-order Curve

思路

可以发现其实是由一个大的分成四个小的,可以试着用递归来写

这里观察一下l与r的二进制,可以发现从高位到低位开始遍历遇到不同的输出剩余的l即可

代码

void solve(){int l,r;cin>>l>>r;int nowl=0;int ans=0;for(int i=0;i<64;i++){if(((l>>i)&1)!=((r>>i)&1)){ans=nowl;}if((l>>i)&1) nowl+=(1ll<<i);}cout<<ans<<"\n";
}

M. Rejection Sampling

思路

数学题,有一说一我真的很烦这种卡精度的题,因为每次我都调好几发

首先转化题目:

对于某两个方案,选择k-1个相同的数,1个不同的数,就会得到a_1*...*a_k*a_x:a_1*...*a_k*a_y=p_1*...*p_k*p_x*(1-p_y):p_1*...*p_k*p_y*(1-p_x)

化简之后可以得到:\frac{a_x*(1-p_x)}{p_x}=\frac{a_y*(1-p_y)}{p_y}也就是说,\frac{a*(1-p)}{p}是个定值,设定值为m,那么p=\frac{a}{m+a},又因为\sum p=k

可以得到:\frac{a_1}{m+a_1}+...+\frac{a_n}{m+a_n}=k,因为单调的所以我们可以用二分来求出m来

但这样写出来的代码会TLE,此处有两种修改方案,

1.可以发现m最大为1e18,精度要求1e-6,那么最大的二分次数log_2(1e18)+log_2(1e6),可以发现不会超过100次,所以我们直接枚举100次二分过程即可

2.将(r-l>eps)修改成相对误差((r-l)/l>eps),l越大要求更严格,越小要求更宽松,这样也可以缩减二分次数

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;
#define double long doubleconst double eps=1e-6;void solve(){int n,k;cin>>n>>k;vector<double> a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}auto cal=[&](double m)->vector<double>{vector<double> p(n+1);for(int i=1;i<=n;i++){p[i]=a[i]/(m+a[i]);}return p;};double l=0,r=1e15;while((r-l)/l>eps){double mid=(l+r)/2;auto p=cal(mid);double sum=accumulate(p.begin()+1,p.begin()+1+n,0.0l);if(sum>k){l=mid;}else{r=mid;}}vector<double> p=cal(l);for(int i=1;i<=n;i++){cout<<p[i]<<"\n";}
}
signed main() {// vcoistntcout<<fixed<<setprecision(12);int _=1;// cin>>_;while(_--) solve();return 0;
}

F. Infinite Loop

思路

可以发现无非就分为了两种情况:

第一天执行的任务可能有剩余需要第二天接着完成,设此剩余时间为res

  • res要大于一天中所有任务完成的间隙和,也就是说我们从第二天开始任务之间间就没有间隙了,那么这样的话就以一天完成任务的时间为周期,不断重复了
  • res要小于一天中所有任务完成的间隙和,可以发现此种情况,从第二天开始所有的任务在某一天以什么时间开始和结束是一定的

因此我们直接模拟即可

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;
#define double long doubleconst int N=2e5+10;
const int inf=1e18;
const int mod=998244353;const double eps=1e-6;void solve(){int n,k,q;cin>>n>>k>>q;vector<int> a(n+1),b(n+1);for(int i=1;i<=n;i++){cin>>a[i]>>b[i];}vector<int> ans1(n+1);   //记录第一天的答案int now=1;          //当前时间int sum=0;          //差距for(int i=1;i<=n;i++){if(a[i]>now){sum+=(a[i]-now);now=a[i]+b[i];}else{now=now+b[i];}ans1[i]=now;}auto pri=[&](int x)->void{      //输出时间为x时的真正天数+时间int d=(x-1)/k;int h=(x-1)%k;if((x-1)%k) d++;if(h==0) h=k;cout<<d<<" "<<h<<"\n";};int res=now-k-1;if(res>=sum){   //从第二天的任务开始 每x一个周期vector<int> pre(n+1,0);for(int i=1;i<=n;i++){pre[i]=pre[i-1]+b[i];}while(q--){int x,y;cin>>x>>y;if(x==1){pri(ans1[y]);}else{int v=now+(x-2)*pre[n];v+=pre[y];pri(v);}}}else{      //从第二天开始都是一样的vector<int> ans(n+1);for(int i=1;i<=n;i++){if(a[i]+k>now){now=a[i]+k+b[i];}else{now=now+b[i];}ans[i]=now-k;}while(q--){int x,y;cin>>x>>y;if(x==1){pri(ans1[y]);}else{int v=(x-1)*k;// cout<<v+ans[y]<<"\n";pri(v+ans[y]);}}}
}
signed main() {vcoistntcout<<fixed<<setprecision(12);int _=1;// cin>>_;while(_--) solve();return 0;
}

B. Rolling Stones

思路

此题没什么好说的,BFS最短路,题意思路非常清晰

代码

#include<bits/stdc++.h>
using namespace std;#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;const int dx[2][3]={{-1,0,0},{1,0,0}};  //上下移动 1的时候可以向下移动,0向上移动
const int dy[2][3]={{-1,-1,1},{1,-1,1}};  //左右移动const int nx[2][5][3]={     //状态0/1 ,当前底面为x,方向为d,下一面为?{ //0   1       2       3       4{},{3,2,4},{4,1,3},{1,4,2},{2,3,1}},{{},{3,4,2},{4,3,1},{1,2,4},{2,1,3}}
};void solve(){int n;cin>>n;vector<vector<int>> g(n+3,vector<int>(2*(n+1)+1));  //存图for(int i=1;i<=n;i++){for(int j=1;j<=2*i-1;j++){cin>>g[i][j];}}int s,e;cin>>s>>e;queue<pll> q;q.push({1,1});vector<vector<int>> dis(n+3,vector<int>(2*(n+1)+1,-1));dis[1][1]=0;while(!q.empty()){auto [x,y]=q.front();q.pop();int bf=y%2;for(int i=0;i<3;i++){       //三个方向int xx=x+dx[bf][i];       //计算所去往的点int yy=y+dy[bf][i];if(g[xx][yy]==0||dis[xx][yy]!=-1) continue;     //非法位置if(g[xx][yy]==nx[bf][g[x][y]][i]){                  //判断数是否一致dis[xx][yy]=dis[x][y]+1;q.push({xx,yy});}}}cout<<dis[s][e]<<"\n";
}
signed main() {vcoistntcout<<fixed<<setprecision(2);int _=1;// cin>>_;while(_--) solve();return 0;
}

http://www.dtcms.com/a/537641.html

相关文章:

  • 前端文件下载的多种方式:从简单到高级
  • 可信赖的武进网站建设万网 成品网站
  • 大气物流网站模块电商支付网站建设费进什么科目
  • Unity_Canvas_Canvas Scaler画布缩放器。
  • 邢台建设网站公司做网站买那种服务器
  • 企业智能体:企业智脑的最小智能单元,灵活响应多样化业务需求
  • Qt6中文路径
  • 操作系统5.3.5 固态硬盘SSD
  • 最强的手机网站建设环保行业网站开发
  • 二叉树笔记 2025-10-22
  • Gitee仓库清理指南:如何移除误传的无关文件并正确使用.gitignore
  • Linux下编译mjansson/mdns
  • 沈阳招标信息网网站排名优化建设
  • 建设宣传网站上的请示重庆专业网站公司
  • MySQL 深度解析:varchar (50) 与 varchar (500) 的底层差异及选型实践
  • 蓝桥杯知识点大纲(JavaC组)
  • 济南建站网站泛华建设集团有限公司网站
  • 如何做后台网站增删改企业二级域名自助建站平台
  • 网站建设在哪里发布网站页面建设方案书模板
  • 青岛seo网站关键词优化黑龙江建设人员证件查询网站
  • ansible实战- 关机
  • 做网站域名需哪些自贡企业网站建设公司
  • 网站建设与维护方案找建设企业网站公司
  • 网站备案名称修改seo关键词排名优化怎样收费
  • 外销网站php培训
  • 做wow宏的网站网站服务器租用一般费用
  • Rust宏编程完全指南:从基础到高级的元编程艺术
  • 网站制作 徐州哪个网站开发培训好
  • 做网站需要哪些钱做视频网站需要什么服务器
  • 前端3D开发面试全攻略WebGLThreeJS方向