Codeforces Round 966 (Div. 3) (A~F)

devtools/2024/9/24 19:13:45/

文章目录

  • 写在前面
  • A- Primary Task
    • 思路
    • code
  • B. Seating in a Bus
    • 思路
    • code
  • C- Numeric String Template
    • 思路
    • code
  • D- Right Left Wrong
    • 思路
    • code
  • E- Photoshoot for Gorillas
    • 思路
    • code
  • F- Color Rows and Columns
    • 思路
    • code

Codeforces Round 966 (Div. 3)

写在前面

赛时写的还挺快的,50分钟就A了4道题,当时排名已经到2千多了,后面就坐牢1个多小时······,E题一开始想用贪心先把猴子放在网格图的中间,后面觉得实现起来太麻烦了,直接做F题了,赛时也是用的贪心,没过,赛后想了想应该用DP的,本质上就是背包问题,当时没想到这点,DP学了还是不会用,题型还是见太少了····

A- Primary Task

思路

签到题,字符串长度为1或者2 or 字符串前两个字符不为1 0,都输出no
接着特判第三个字符是否为0,还有当长度为3时,第三个字符必须大于1
其他情况输出YES

code

void solve(){string s;cin >> s;if(s.size()==1 || s.size()==2){cout << "NO" << endl;return ;}if(s[0]!='1' || s[1]!='0'){cout << "NO" << endl;return ;} if(s.size()==3 && s[2]<='1' || s[2]=='0'){cout << "NO" << endl;return ;}cout << "YES" << endl;return ;
}

B. Seating in a Bus

思路

除了第一个人,其他人都需要判断当前座位的左右两边是否有人,用一个标记数组即可

code

int a[N],v[N];
void solve(){int n;cin >> n;for(int i=1;i<=n;++i) cin >> a[i];for(int i=1;i<=n+1;++i) v[i]=0;v[a[1]]=1;for(int i=2;i<=n;++i){int flag=0;if(v[a[i]-1]){flag=1;v[a[i]]=1;} if(v[a[i]+1]){v[a[i]]=1;flag=1;} if(flag==0){cout << "NO" << endl;return ;}}cout << "YES" << endl;return ;
}

C- Numeric String Template

思路

考点:模拟

除了第一个字符,其他字符都需要判断当前字符和数字是否一一对应
这时我们需要开两个map数组,一个map是字符判断数字,另一个map是数字判断字符
注意:数字可能为0,所以当数字为0时将0赋值成另一个值即可

code

int a[N];
void solve(){int n;cin >> n;for(int i=1;i<=n;++i) cin >> a[i];int m;cin >> m;while(m--){int flag=1;string s;cin >> s;if(s.size()!=n){cout << "NO" << endl;continue;}s=' '+s;unordered_map<char,int> m2;unordered_map<int,char> m1;if(a[1]==0) a[1]=1e10;m1[a[1]]=s[1];m2[s[1]]=a[1];for(int i=2;i<=n;++i){if(a[i]==0) a[i]=1e10;if(m1[a[i]]==0 && m2[s[i]]==0){m1[a[i]]=s[i];m2[s[i]]=a[i];}else{if(m1[a[i]] && m1[a[i]]!=s[i]){cout << "NO" << endl;flag=0;break;}if(m2[s[i]] && m2[s[i]]!=a[i]){cout << "NO" << endl;flag=0;break;}m1[a[i]]=s[i];m2[s[i]]=a[i];}}if(flag) cout << "YES" << endl;}return ;
}

D- Right Left Wrong

思路

考点:贪心+双指针

由于内层的LR不会影响外层的LR,但是外层的LR会影响内层的LR
好比LLRR,先选里面的LR,不会影响外面的LR

这时,我们就需要从外层开始遍历,l指针为0,r指针为n
每次左指针找到L,右指针找到R,就将里面的值全部加起来
在遍历之前需要先对数组进行前缀和,方便后续相加

code

int a[N],sum[N];
void solve(){int n;cin >> n;for(int i=1;i<=n;++i){cin >> a[i];sum[i]=sum[i-1]+a[i];	} string s;cin >> s;s=' '+s;int ans=0;int pos1=1,pos2=n;while(1){int k1=s.find('L',pos1);int k2=s.rfind('R',pos2);if(k1==-1 || k2==-1) break;for(int i=pos1;i<=k1;++i) s[i]='.';for(int i=k2;i<=pos2;++i) s[i]='.';ans+=sum[k2]-sum[k1-1];pos1=k1+1;pos2=k2-1;}cout << ans << endl;return ;
}

E- Photoshoot for Gorillas

思路

考点:数学思维

首先我们想让价值尽可能大,很容易想到先让数字大的放在网格中间,那么我们只需要考虑每个网格能被扫描几次即可

我们先拿列数来说,如果当前列数小于矩阵k,那么它能被扫描的次数自然也就是它的下标j,否则它能被扫描的次数就为k
这时我们就需要考虑它是否超出右边界,如果超出右边界,就需要减去超出的数量
因此,它的公式就为 m i n ( k , j + 1 ) − m a x ( j + k − m , 0 l l ) min(k,j+1)-max(j+k-m,0ll) min(k,j+1)max(j+km,0ll)

行数同理,接着我们将数组从大到小排序,将他们放入进去即可

code

bool cmp(int x,int y){return x>y;
}
void solve(){int n,m,k;cin >> n >> m >> k;int w;cin >> w;vector<int> a(w),cnt;for(auto &x : a) cin >> x;for(int i=0;i<n;++i)for(int j=0;j<m;++j){int x=min(k,j+1)-max(j+k-m,0ll);int y=min(k,i+1)-max(i+k-n,0ll);cnt.push_back(x*y);}sort(a.begin(),a.end(),cmp);sort(cnt.begin(),cnt.end(),cmp);int ans=0;for(int i=0;i<w;++i){ans+=a[i]*cnt[i];}cout << ans << endl;return ;
}

F- Color Rows and Columns

思路

考点:贪心+背包DP
首先我们可以将分数看成重量,将操作数看成价值
既然是DP,我们可以开两个一维数组,一个存总体数据,一个存动态数据(由于是一维,当前状态不能影响上一层的状态,需要多开一个数组
对于每次的长度和宽度,我们可以用贪心去考虑,每次都填入长度小的那一个
这时我们需要特判一下,当 a = 1 并且 b = 1 a=1 并且 b=1 a=1并且b=1那么填入这个格子,它的分数是+2的
每操作一次,我们就对当前价值和重量进行01背包的处理
由于上述可能会出现+2的情况,我们最终的分数k+1可能会比分数k的操作数更少,所以在进行DP时,它的上限为k+1
最后比较 f [ k ] 和 f [ k + 1 ] f[k]和f[k+1] f[k]f[k+1] 的大小即可

code

const int inf=1e9;
void solve(){int n,k;cin >> n >> k;vector<int> f(k+3,inf),g(k+3,inf);f[0]=0;for(int i=1;i<=n;++i){int a,b;cin >> a >> b; int w=0,v=0;g=f;while(w<=k && a && b){w++;if(a>b){v+=b;a--;}else if(a<b){v+=a;b--;}else{if(a==1){v+=1;w++;a--,b--;}else{v+=b;a--;}}for(int j=k+1;j>=w;--j){g[j]=min(g[j],f[j-w]+v);}}f=g;}int ans=min(f[k],f[k+1]);cout << (ans==inf? -1 : ans) << endl;return ;
}

http://www.ppmy.cn/devtools/94595.html

相关文章

在线预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;在线预约管理&#xff0c;管理员管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;在线预约&#xff0c;我的 开发系统&#xff1a;Windows 架构模…

爬虫 Web Js 逆向基础:window 对象常用属性和方法

1. 简述 Js 中&#xff0c;一切皆对象&#xff0c;变量、属性、方法都可以通过 “对象名.属性名” 的格式调用。 在以下介绍的 6 种对象中&#xff0c;浏览器窗口对象 window 比较特殊&#xff0c;其他 5 种对象都为 window 对象的一种属性&#xff0c;同时 window 对象的属性…

GNU/Linux - memtool使用

在Yocto中为NXP的i.MX系列芯片构建Linux系统时&#xff0c;可以加入一些实用工具&#xff0c;比如直接操作内存的memtool。 这些工具在imx-test包中&#xff0c;比如imx-test_git.bb里。 比如在imx-image-core.bb中&#xff0c;IMAGE_INSTALL "imx-test" &#xff0…

C# VideoCapture 多路视频播放

目录 效果 项目 代码 下载 效果 C#VideoCapture多路视频播放 项目 代码 using OpenCvSharp; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks…

大数据机器学习算法岗位分析推荐:基于Python的招聘大数据爬虫可视化分析推荐系统

文章目录 大数据推荐算法招聘数据分析&#xff1a;基于Python招聘大数据爬虫数据可视化分析推荐系统一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构 五、部分模块核心代码六、数据采集模块七、数据管理模块八、部分数据展示九、项目截图系统用户登…

arch 系统清理和瘦身

节省磁盘空间 pacman -Sc # 清理未安装软件包 pacman -Scc # 清理缓存中所有内容 yay -Scc # 如果安装了yay 直接用yay清理就好查看所有已经安装的包&#xff0c;看需求删除 # 列出所有本地软件包&#xff08;-Q,query查询本地&#xff1b;-q省略版本号&#xff09;sudo pa…

使用 TensorRT 进行推理的系统讲解

使用 TensorRT 进行推理需要几个主要步骤&#xff0c;从创建 Runtime 到最终的推理。这些步骤包括&#xff1a; 创建 Runtime 反序列化引擎 创建 Execution Context 分配内存 图像前处理 执行推理 结果后处理 以下是对每一步的详细解释&#xff1a; 1. 创建 Runtime 目的…

LSPosed模块开发第一篇

安装LSPosed 设备pixel 3a Android 12 Magisk root 环境 LSPosed地址&#xff1a; https://github.com/LSPosed/LSPosed 下载zygisk的&#xff0c;riru没效果 https://github.com/LSPosed/LSPosed/releases 下载完push 到手机&#xff0c;Magisk 安装模块 Magisk设置里面的Z…