第36次ccf-csp题解(思维)

news/2024/12/23 20:39:01/文章来源:https://www.cnblogs.com/1747176348mi/p/18623758
  • 比赛链接 https://sim.csp.thusaac.com/contest/36/home

  • 比赛感受

这会刚打完上海icpc,比起区域赛的题,这个简单太多了。
感受还不错,写的很顺手。除了第3题,其他3题都是一发过。
刷题得长期刷。





 
 

  • A题 移动

题意:f : y+1 ;  b : y-1 ;   l : x-1 ;  r : x+1

 
一个简单的模拟,若当前操作使机器人移出场地,那么使机器人移回来就好

#include <bits/stdc++.h>
#define int long long
using namespace std;
void ooo(int x){cout<<x<<'\n';
}
signed main()
{int n, k;cin>>n>>k;for(int i=1;i<=k;i++){int x, y;cin>>x>>y;string s;cin>>s;int len=s.size();for(int j=0;j<len;j++){if(s[j]=='f')y+=1;else if(s[j]=='b')y-=1;else if(s[j]=='l')x-=1;else x+=1;if(y>n)y--;if(y<1)y++;if(x>n)x--;if(x<1)x++;}cout<<x<<' '<<y<<'\n';}return 0;
}

  • B题 梦境巡查

这个题不算太难,有点思维,对码力要求不高。

  

它假设当bi为0时求初始时要带的最小补给。

关键在于怎样维护bi=0时,全程中所拥有补给的最小量(为负数表示还需要多少补给) 所以就是一个单点修改,以bi为分界处,维护前半段和后半段最小值,对两段最小值取最小值,为负数则取绝对值,为非负数则为0。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xmmm=2e5+10;
int a[xmmm], b[xmmm];
int c[xmmm];
int sum[xmmm];
int pmi[xmmm], lmi[xmmm];
int ans[xmmm];
void ooo(int x){cout<<x<<'\n';
}
signed main()
{int n;cin>>n;for(int i=0;i<=n;i++){cin>>a[i];c[i*2+1]=0-a[i];}for(int i=1;i<=n;i++){cin>>b[i];c[i*2]=b[i];}pmi[0]=lmi[2*n+2]=0-1e10;for(int i=1;i<=2*n+1;i++){sum[i]=sum[i-1]+c[i];}for(int i=1;i<=2*n+1;i++){if(i==1)pmi[i]=sum[i];else pmi[i]=min(pmi[i-1], sum[i]);}for(int i=2*n+1;i>=1;i--){if(i==2*n+1)lmi[i]=sum[i];else lmi[i]=min(lmi[i+1], sum[i]);}for(int i=1;i<=n;i++){int pos=i*2;int t1=pmi[pos-1];int t2=lmi[pos]-b[i];ans[i]=min(t1, t2);}for(int i=1;i<=n;i++){if(ans[i]<0)cout<<0-ans[i]<<' ';else cout<<0<<' ';}return 0;
}
/*3
5 5 5 5
0 100 039 4 6 2
9 4 6
*/

  • D题 跳房子

这个题感觉还没有C题难。
这其实是一个很简单的图遍历的问题
建完边还是只有一个前驱的这种,简单版的迪杰斯特拉。
处理出b数组,每个点只入队列一次。

#include <bits/stdc++.h>
//#define int long long
using namespace std;
void ooo(int x){cout<<x<<'\n';
}
struct p{int id, num;
};
const int xmmm=2e5+10;
int a[xmmm], b[xmmm], k[xmmm];
int dis[xmmm];
bool vis[xmmm];
signed main()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];b[i]=i-a[i];}for(int i=1;i<=n;i++)cin>>k[i];int pos=0;queue<p>q;//q.clear();q.push(p{1, 0});int ans=-1;while(!q.empty()){p t=q.front();q.pop();if(vis[t.id])continue;vis[t.id]=1;if(t.id==n){ans=t.num;break;}int x=t.id;if(x+k[x]<=pos)continue;if(x+k[x]>=n){q.push(p{n, t.num+1});continue;}for(int i=max(pos+1, x+1);i<=min(n, x+k[x]);i++){q.push(p{b[i], t.num+1});}pos=max(pos, x+k[x]);}cout<<ans<<'\n';return 0;
}
/*5
0 1 2 3 0
3 4 4 10 1510
0 1 1 1 1 3 1 0 3 0
2 4 5 4 1 4 1 3 5 3
*/

  • C题 缓存模拟


一个大模拟按他的要求来就好了,详细的可以看注释

#include <bits/stdc++.h>
#define int long longusing namespace std;
const int xxx=3e5;
const int xx=7e4;
int head[xxx],nnum[xxx];//m组里有多少个
struct p{int x, y;
};
vector<p>ans;
void ooo(int x){cout<<x<<'\n';
};
struct node {int id, num;bool operator<(const node &a)const {return a.num<num;}
};
priority_queue<node>qq[xx];
unordered_map<int, int>a, vis;//位置//是否修改
signed main()
{int n, m, q;cin>>n>>m>>q;for(int i=1;i<=q;i++){int x, y;cin>>x>>y;if(a[y]){//判断是否命中int pos=(y/n)%m;head[pos]++;qq[pos].push(node{y, head[pos]});a[y]=head[pos];if(x==0)x=x;else {vis[y]=1;//判断是否改写}}else {int pos=(y/n)%m;//位置if(nnum[pos]==n){//如果已经满了while(!qq[pos].empty()){node tt=qq[pos].top();qq[pos].pop();if(a[tt.id]!=tt.num)continue;if(vis[tt.id]){//cout<<"pos"<<tt.id<<' '<<tt.num<<' '<<a[tt.id]<<'\n';ans.push_back(p{(int)1, tt.id});vis[tt.id]=0;}head[pos]++;a[y]=head[pos];if(x)vis[y]=1;qq[pos].push(node{y, head[pos]});ans.push_back(p{(int)0, y});a[tt.id]=0;break;}}else {head[pos]++;a[y]=head[pos];nnum[pos]++;qq[pos].push(node{y, head[pos]});if(x)vis[y]=1;ans.push_back(p{(int)0, y});}}}int len=ans.size();for(int i=0;i<len;i++){cout<<ans[i].x<<' '<<ans[i].y<<'\n';}return 0;
}
/*4 8 8
0 0
0 1
1 2
0 1
1 0
0 32
1 33
0 341 1 3
1 0
1 1
0 2
*/

  • 自我总结

这次写题的顺序是1243,再写一点点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857650.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php网络编程swoole http

服务端:<?php use Swoole\Http\Server; use Swoole\Http\Request; use Swoole\Http\Response;// 创建 HTTP 服务器 $server = new Server(127.0.0.1, 9501);$server->on(start, function ($server) {//print_r($server);echo "Swoole http server is started at h…

JVM简介—2.垃圾回收器和内存分配策略

大纲 1.垃圾回收概述 2.如何判断对象存活 3.各种引用介绍 4.垃圾收集的算法 5.垃圾收集器的设计 6.垃圾回收器列表 7.各种垃圾回收器详情 8.Stop The World现象 9.内存分配与回收策略 10.新生代不同配置演示 11.内存泄漏和内存溢出 12.JDK为提供的工具1.垃圾回收概述 2.如何判…

OpenAI 推出嵌入式硬件 SDK,支持 ESP32 语音开发;INFP:音频驱动的双人对话头像生成,自动区分说话者和倾听者

开发者朋友们大家好:这里是 「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

8086汇编(16位汇编)学习笔记02.分段,机器码和寻址

原文链接:https://bpsend.net/thread-112-1-2.html 分段问题1 8086是16位cpu,最多可以访问(寻址)多大内存?运算器一次最多处理16位的数据。地址寄存器的最大宽度为16位。访问的最大内存为:216 = 64K 即 0000 - FFFF。问题2 8086允许最大内存1M,如何实现访问(寻址)到所…

AI对话机器人续:将AI Bot接入企业微信

之前尝试将Coze AI Bot接入到了微信,有朋友问如何接入企业微信,今天有空尝试了下,和你分享一下过程。整体流程和步骤还是基于chatgpt-on-wechat这个开源框架来的,唯一的差别就在于部署chatgpt-on-wechat的时候,需要填写一些企业微信相关的参数和secret。大家好,我是Ediso…

python网络编程之udp

服务端:import socketsk = socket.socket(type=socket.SOCK_DGRAM) # 表示一个udp协议 sk.bind((127.0.0.1, 9504))# 服务端不能先发送消息,因为服务端不知道客户端的ip while True:msg, addr = sk.recvfrom(1024)print(f"接收到客户端数据:{msg.decode(utf-8)}"…

Qt编程快速入门(1)Qt结构简介

Qt构成Qt(/ˈkjuːt/,发音同“cute”)是一个跨平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,例如控制台工具和服务器。-摘自维基百科Qt可以在多个平台编译运行,包括Windows、Linux、Mac OS,其运行时的表现取决…

python网络编程之websocket

服务端:import asyncio import websockets# 保存已连接的客户端列表 connected_clients = set()async def handle_websocket(websocket):# 将新的客户端添加到已连接客户端列表remote_address = websocket.remote_addressconnected_clients.add(websocket)print(f"新的客…

.NET 阻止系统睡眠/息屏

本文介绍Windows系统设备下如何阻止系统睡眠/息屏,以及想看当前阻止睡眠/息屏的应用信息 powercfg /requests查看活动列表 在播放音乐时,我们会发现设置了系统电源管理-自动睡眠,计划不会生效,这个音频播放操作阻止了系统自动睡眠。但不会阻止息屏,所以Windows下一般屏幕关…

python网络编程之http longpull

服务端:from flask import Flask, request, jsonify import timeapp = Flask(__name__)@app.route(/stream, methods=[GET]) def poll():# 假设这里有一个方法来检查是否有新数据# 为了示例,我们简单地模拟等待数据time.sleep(5) # 模拟处理时间或等待数据# 假设这是从某处获…

Python中指数概率分布函数的绘图详解

在数据科学和统计学中,指数分布是一种应用广泛的连续概率分布,通常用于建模独立随机事件发生的时间间隔。通过Python,我们可以方便地计算和绘制指数分布的概率密度函数(PDF)。本文将详细介绍指数分布的原理、应用场景,并提供详细的代码示例,展示如何在Python中绘制指数分…

VScode + cmake编写Qt程序

本机环境 Ubuntu 20.04 Qt 5.12.81. 安装Vscode直接在官网下载对应的deb包安装即 可。下载后在deb包所在目录执行如下命令安装deb包。sudo dpkg -i 安装包名.deb然后在应用程序中应该就有了Vscode的图标了。2. 安装cmake与gcc g++先安装cmakesudo apt-get install cmake然后安装…