CF933-Div3 大致思路+题解
\(Rank\)
A - Rudolf and the Ticket
纯水题 暴力枚举直接过
$code$
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
typedef long long ll;
using namespace std;
const int Ratio=0;
const int N=200005;
const int maxx=INT_MAX;
int T,n,m,k;
int b[N],c[N];
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
cin>>T;
while(T--)
{
cin>>n>>m>>k;
int cnt=0;
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=m;i++)
cin>>c[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(b[i]+c[j]<=k)
cnt++;
printf("%d\n",cnt);
}
return Ratio;
}
B - Rudolf and 121
题目中要求的是变换\(i\)同时修改两边的值
换个角度就是变换\(i-1\)的同时修改\(i\)和\(i+1\)
过一遍循环 当出现$a[i] $$<$$0$时标记并直接退出循环
输出\(YES\)的条件是没有标记并且\(a[n-1]\)和\(a[n]\)均为\(0\)
$code$
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
typedef long long ll;
using namespace std;
const int Ratio=0;
const int N=200005;
const int maxx=INT_MAX;
int n;
int a[N];
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
int T=qr;
while(T--)
{
n=qr;
fo(i,1,n)
a[i]=qr;
bool fla=true;
fo(i,1,n-2)
{
if(a[i]<0)
{
fla=false;
break;
}
a[i+1]-=2*a[i];
a[i+2]-=a[i];
a[i]=0;
}
if(fla==true&&a[n-1]==0&&a[n]==0)
printf("YES\n");
else
printf("NO\n");
}
return Ratio;
}
C - Rudolf and the Ugly String
字符串!噔咚噔
还是较为简单的 毕竟是\(c\)题
简单观察后就能发现要求的字符串\(map\)和\(pie\)唯一结合的方式是变成\(mapie\) 不会出现重叠和套娃的情况
因此我们选用方便的\(substr\)来判定以下情况:
若前方存在\(mapie\) 则答案++ 同时向右走\(5\)位
其次 若前方存在\(map\)或\(pie\) 答案++ 同时向右走\(3\)位
否则 向右走\(1\)位
$code$
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
typedef long long ll;
using namespace std;
const int Ratio=0;
const int N=200005;
const int maxx=INT_MAX;
int n,cnt;
string s;
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
int T=qr;
while(T--)
{
n=qr;
cin>>s;
cnt=0;
int i=0;
while(i<n)
{
if(i+5<=n&&s.substr(i,5)=="mapie")
cnt++,i+=5;
else if(i+3<=n&&s.substr(i,3)=="map")
cnt++,i+=3;
else if(i+3<=n&&s.substr(i,3)=="pie")
cnt++,i+=3;
else
i++;
}
printf("%d\n",cnt);
}
return Ratio;
}
D - Rudolf and the Ball Game
一眼转圈问题 这道题难在有个"\(?\)" 直接暴力\(dfs\)会在第\(3\)个测试点\(T\)掉
接下来 请出本场\(MVP\) :\(set!\)
众所周知(其实我\(T\)了好久才想起来 \(set\)的特性是维护一个严格单调递增的数列 但本题选用它的原因主要在 它会自动删除重复的元素!
因此 在这道可能性很多且易重复的题里面 \(set\)成为了比剪枝\(dfs\)更好的选择
学习\(set\)请自行跳转\(cppreference\)和\(CSDN\)
$code$
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
typedef long long ll;
using namespace std;
const int Ratio=0;
const int N=200005;
const int maxx=INT_MAX;
int n,m,x;
int dis;
char c;
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
int T=qr;
while(T--)
{
n=qr,m=qr,x=qr;
set<int>dh,yy;
dh.insert(x-1);
fo(i,1,m)
{
dis=qr;
cin>>c;
if(c=='0')
for(auto i:dh)
yy.insert((dis+i)%n);
else if(c=='1')
for(auto i:dh)
yy.insert((i+n-dis)%n);
else if(c=='?')
for(auto i:dh)
{
yy.insert((dis+i)%n);
yy.insert((i+n-dis)%n);
}
dh=yy;
yy.clear();
}
printf("%d\n",dh.size());
for(auto i:dh)
printf("%d ",i+1);
printf("\n");
}
return Ratio;
}
E - Rudolf and k Bridges
一眼\(dp\) 关于它感觉不需要特别说明
首先 在输入桥时直接求出每一行的最优值
然后直接一个\(for\)找\(k\)个连续的较小值作答案即可
记得开\(long long\)!!!
插叙
第一遍
const int maxx=INT_MAX;
第二遍
"哦 不对 是long long"
const int maxx=1e18;
第三遍
const ll maxx=1e18..
乐
$code$
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
inline int qr()
{
char ch=getchar();int x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
typedef long long ll;
using namespace std;
const int Ratio=0;
const int N=200005;
const ll maxx=1e18;
int n,m,k,d;
int dh[N];
ll dp[N],cost[N];
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
int T=qr;
while(T--)
{
n=qr,m=qr,k=qr,d=qr;
fo(k,1,n)
{
fo(i,1,m)
dh[i]=qr,dp[i]=maxx;
deque<pair<ll,ll> >q;//钱 位置
dp[1]=1;
q.push_back(make_pair(1,1));
for(int i=2;i<=m;i++){
dp[i]=min(dp[i],q.front().first+dh[i]+1);
while(!q.empty()&&dp[i]<=q.back().first)
q.pop_back();
q.push_back(make_pair(dp[i],i));
if(i-d>q.front().second)
q.pop_front();
}
// cout<<dp[m]<<endl;
cost[k]=dp[m];
// cost[k]=cost[k-1]+dp[m];
// cout<<cost[k]<<"||||||||"<<endl;
}
ll ans=maxx;
fo(i,1,n-k+1)
{
ll res=0;
fo(j,i,i+k-1)
res+=cost[j];
ans=min(ans,res);
}
printf("%lld\n",ans);
}
return Ratio;
}
F - Rudolf and Imbalance
\(MVP\)再次登场
严格单增 完美契合\(set\)
一开始直接找初始\(a[N]\)中最大差和次大差
然后对最大差进行操作 用给的\(f\)和\(d\)操作将它分成两个尽量大的差 因为这样才能保证它们中较大的那个更小 更满足题意
然后还是\(long long\)
别的没什么太要紧的了 关于\(lower_{—} bound\)返回指针类型等的小点 我在代码中也加入了部分注释
$code$
#include<bits/stdc++.h>
#define fo(x,y,z) for(int (x)=(y);(x)<=(z);(x)++)
#define fu(x,y,z) for(int (x)=(y);(x)>=(z);(x)--)
typedef long long ll;
inline ll qr()
{
char ch=getchar();ll x=0,f=1;
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
#define qr qr()
using namespace std;
const int Ratio=0;
const int N=200005;
const int maxint=INT_MAX;
const ll maxll=1e18;
int n,m,k;
ll a[N];
ll deta,detaa,lb,rb,ans;
set<ll>f,d;
int main()
{
// freopen("1.inll","r",stdin);
// freopen("1.out","w",stdout);
int T=qr;
while(T--)
{
n=qr,m=qr,k=qr;
f.clear(),d.clear();
deta=0,detaa=0;
fo(i,1,n)
{
a[i]=qr;
if(i!=1)//输入时直接寻找最大差和次小差
if(deta<a[i]-a[i-1])
{
detaa=deta;
deta=a[i]-a[i-1];
lb=a[i-1],rb=a[i];
//由于单增排序 左边界为小
}
else if(detaa<a[i]-a[i-1])
detaa=a[i]-a[i-1];
}
fo(i,1,m)
{
ll dd=qr;
d.insert(dd);
}
fo(i,1,k)
{
ll ff=qr;
f.insert(ff);
}
ans=deta;
for(auto i:f)
{
auto dh=d.lower_bound((lb+rb)/2-i),yy=dh;
//找最接近中间的 分开后两差大的尽量小
ll dh1=*dh,yy1=*yy;
//lower_bound值是指针类型无法运算 加*
ans=min(ans,max(dh1+i-lb,rb-i-dh1));
if(yy!=d.begin())
//不是队首 指针需向上取 保证答案最优
{
yy--;
yy1=*yy;
ans=min(ans,max(yy1+i-lb,rb-i-yy1));
}
}
cout<<max(detaa,ans)<<endl;
//此时再次比较次大值和更改后最大值
}
return Ratio;
}//
G - Rudolf and Subway
太蒻了 还没做出来。。
CF933-Div3 大致思路+题解的更多相关文章
- Egret学习笔记 (Egret打飞机-1.大致思路)
大致看了一遍Egret的官方文档,就开始打算使用Egret来开发一个打飞机游戏. 首先来捋一捋思路,先来看一看一个打飞机游戏的图片 基本上一个打飞机游戏分为 开始游戏 ----------进入游戏 ...
- 发送邮件使用html模板的实现的大致思路
客户最近有一个需求,大致的意思是提供一个 word文档,让其作为一个模板,在发送邮件的时候能够实现按照这个模板的样式和内容,替换其中 的一些字段,作为邮件的内容发给收件人.这个需求最大的问题就是在于这 ...
- SVM大致思路整理
(一)线性可分 我们忽略建立目标函数的过程,直接写出目标函数. 原问题: 首先,我们得到了目标函数: 这是一个凸优化问题,直接可以用软件可以求解: 对偶问题: 原问题根据一系列的变换,可写成: 满足某 ...
- 前端标签--js--css大致思路
html标签语言在块级和内联标签的基础上进行页面的设计,设计的时候主要是注意标签块间的距离位置等信息,设计盒子的浮动,盒子的位置,盒子之间的联系. 在设计网页之前一定要判断好该设计多少个盒子,什么样的 ...
- WCF入门大致思路
WCF服务: 1.IServer.cs(类似接口,WCF接口) 2.Server.svc(实现了WCF接口)右键浏览器运行可以看到WCF服务链接,类似(http://localhost:4609/Us ...
- 【小白入门向】tarjan算法+codevs1332上白泽慧音 题解报告
一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A ...
- 算法(第四版)C# 习题题解——2.3
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:http ...
- dp方法论——由矩阵相乘问题学习dp解题思路
前篇戳:dp入门——由分杆问题认识动态规划 导语 刷过一些算法题,就会十分珍惜“方法论”这种东西.Leetcode上只有题目.讨论和答案,没有方法论.往往答案看起来十分切中要害,但是从看题目到得到思路 ...
- 题解 P1436 【棋盘分割】
题目链接 其实呢大致思路和下面的大佬们都很像.发这篇题解的目的就是加了一点~~优化~~骗分技巧. 转移方程: 设$dp[i][j][x][y][k]$表示左上$(i,j)$,右下$(x,y)$,第$k ...
- 题解 P3717 【[AHOI2017初中组]cover】
题目链接 本题的大致思路就是搜索. 将矩阵初始化成false.先把灯塔标记.在搜一遍灯塔能照到的点并标记.最后搜一遍找被灯塔标记的个数. 详细解释见题解. 题解走起. #include<bits ...
随机推荐
- 13 JavaScript关于prototype(超重点)
13 JavaScript关于prototype(超重点) prototype是js里面给类增加功能扩展的一种模式. 写个面向对象来看看. function People(name, age){ th ...
- #二进制拆分,矩阵乘法#洛谷 6569 [NOI Online #3 提高组] 魔法值
题目 分析 考虑一个点的权值能被统计到答案当且仅当其到1号点的路径条数为奇数条. 那么设 \(dp[i][x][y]\) 表示从 \(x\) 到 \(y\) 走 \(i\) 步路径条数的奇偶性, 这个 ...
- #Tarjan,SPFA,差分约束系统#BZOJ 2330 AcWing 368 银河
题目 分析 首先这明显是一道差分约束题,但是无解的情况确实比较恶心, 考虑它的边权为0或1,无解当且仅当某个强连通分量内的边至少一条边边权为1, 那么用有向图的Tarjan缩点后跑SPFA就可以了 代 ...
- OpenHarmony系统能力SystemCapability使用指南
一.概述 1.系统能力与 API SysCap,全称SystemCapability,即系统能力,指操作系统中每一个相对独立的特性,如蓝牙,WIFI,NFC,摄像头等,都是系统能力之一.每个系统能力对 ...
- 震撼!这个Python模块竟然能自动修复代码!
说到Python的强大的地方,那真的是太多了,优雅.简洁.丰富且强大的第三方库.开发速度快,社区活跃度高等,所以才使得Python才会如此的受欢迎. 今天给大家介绍一个特别暴力的Python库: Fu ...
- HMS Core分析服务智能运营,“智能时机”上线,轻松提升Push点击
对于运营者来说,消息推送一直是提升用户活跃与转化的重要工具,如何在提升转化的情况下,同时不降低用户的接受程度,这一直是运营不断追求的目标. 好的推送不只在于优质的推送内容,还需要把握合适的时机.在合适 ...
- labelme转coco数据集
原始labelme数据目录结构如下: |-- images | |--- 1.jpg | |--- 1.json | |--- 2.jpg | |--- 2.json | |--- ....... | ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Shape)
一.Shape Shape组件是用于创建2D形状和粒子效果的组件.它可以创建包括圆形.正方形.三角形和多边形等基本形状,同时还可以自定义形状.Shape组件创建各种不同的效果,例如火花.烟雾.雨滴等. ...
- LRU缓存及其实现
缓存是我们日常开发中来提高性能最直接的方式,经常会听到有人说:性能不行?是因为你没加缓存!常见的缓存有外部缓存服务以及程序内部缓存,外部缓存服务包括:Redis.Memcached等,内部缓存就是我们 ...
- 在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C
在RockyLinux 9.3环境中采用RPM模式部署Oracle 19C 用途 在开发数据库系统时,可以验证功能是否与Oracle的表现一致,验证正确性和兼容性 限制 虚拟机安装,CPU 2*4 内 ...