coderforces round 894(div.3)

2023-10-27

Problem - A - Codeforces

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=25;
char s[N][N];
int n,m;
void solve() {
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>s[i][j];
        }
    }
    int cnt=0;
    string temp="vika";
    for(int j=1;j<=m;j++){
        for(int i=1;i<=n;i++){
            if(s[i][j]==temp[cnt]){
                cnt++;
                break;
            }
        }
    }
    if(cnt==4) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - B - Codeforces

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=2e5+10;
int b[N];
int n;
void solve() {
    cin>>n;
    vector<int>ans;
    for(int i=1; i<=n; i++) cin>>b[i];
    ans.push_back(b[1]);
    for(int i=2; i<=n; i++) {
        int x=b[i-1];
        if(b[i-1]<=b[i]&&b[i]<=b[i+1]) ans.push_back(b[i]);
        else {
            x--;
            while(x>b[i]) x--;
            if(x>0) ans.push_back(x);
            ans.push_back(b[i]);
        }
    }
    cout<<ans.size()<<endl;
    for(auto v:ans) cout<<v<<' ';
    cout<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - C - Codeforces

一开始都是一列一列竖着放置的,后将其横着放置(长的放在下面),问形状是否和之前一样

如果可行的话,变换后形状是不变的,那么一列一列看,变换后的第一列高度和之前一样,假设高度为a[1],那么至少得有a[1]列高度大于等于1才能拼成第一列,同理至少得有a[2]列高度大于等于2才能拼成第二列...

可以用树状数组来记录有几列高度是小于等于x的,即为sum(x),然后mp[x]记录有几列高度等于x,n-(sum(x)-mp[x])即为有几列高度大于等于x

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=2e5+10;
int a[N];
int tr[N];
int n;
//树状数组
int lowbit(int x) {
    return x & -x;
}
void add(int x,int c) {
    for(int i=x; i<=n; i+=lowbit(i)) tr[i]+=c;
}
int sum(int x) {
    int res=0;
    for(int i=x; i; i-=lowbit(i)) res+=tr[i];
    return res;
}
void solve() {
    cin>>n;
    map<int,int>mp;
    memset(tr,0,sizeof tr);
    for(int i=1; i<=n; i++) {
        cin>>a[i];
        mp[a[i]]++;//统计a[i]的个数
        add(a[i],1);
    }
    bool flag=true;
    for(int i=1; i<=n; i++) {
        if(n-(sum(i)-mp[i])<a[i]) {
            cout<<"No"<<endl;
            return;
        }
    }
    cout<<"Yes"<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

E.Kolya and Movie Theatre

一开始以为是dp,选与不选,然后选m个,但是状态转移不太好写

实际上这题是贪心

首先,假如我们选第一个,第三个,第五个,那么总共的娱乐值为a1+a3+a5-1*d-2*d-2*d=a1+a3+a5-5*d,所以我们将选的娱乐值全部加起来,然后看下标最大的是哪一个,记为i,再减去d*i即可

于是,我们可以贪心,将选择的放在优先队列中(肯定得放大于0的),然后当队列中的个数小于m时,就继续放,当队列中的个数等于m时,由于最大的下标一定,即减去的d*i一定,所以我们要使得放入队列的娱乐值这和最大,那么就要将队头(娱乐值最小的)和即将放入的比较,删去娱乐值最小的

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=2e5+10;
int a[N];
int n,m;
ll d;
void solve() {
    cin>>n>>m>>d;
    for(int i=1; i<=n; i++) cin>>a[i];
    priority_queue<int,vector<int>,greater<int>>q;
    ll sum=0;
    ll ans=0;
    for(int i=1; i<=n; i++) {
        if(a[i]<0) continue;
        if(q.size()==m&&q.top()<a[i]) {
            sum-=q.top();
            q.pop();
        }
        if(q.size()<m) {
            q.push(a[i]);
            sum+=a[i];
        }
        ans=max(ans,sum-d*i);
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - D - Codeforces

组合数

首先,对于不同种的球,假设有x种球,那么组合数就是C(x,2),但是注意题目的要求是exactly,也就是说刚好n种

先二分找到第一个满足C(l,2)大于等于n的l,先特判如果C(l,2)刚好等于n,那么直接输出l

否则我们只能取l-1个不同种类的球,组合数就是C(l-1,2),然后补足剩下的,假设还差diff个,那么就在原来已经有的球中选diff种,每种球加一个,那么答案即为l-1+diff

可以保证,diff一定小于等于l-1,因为C(l-1,2)小于n,C(l,2)大于等于n,diff等于n-C(l-1,2),所以diff小于等于C(l,2-C(l-1,2),即l-1

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<stack>
#define endl '\n'
#define int long long
using namespace std;
typedef long long ll;
int n;
void solve() {
    cin>>n;
    int l=0,r=2e9;
    while(l<r){
        int mid=(l+r)/2;
        if(mid*(mid-1)/2>=n) r=mid;
        else l=mid+1;
    }
    if(l*(l-1)/2==n){
        cout<<l<<endl;
        return;
    }
    int diff=n-(l-1)*(l-2)/2;
    int res=l-1+diff;
    cout<<res<<endl;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0); 
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - F - Codeforces

原本是想用贪心的,优先杀死能量值大的怪兽,于是写下了以下代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define endl '\n'
#define int long long
using namespace std;
typedef long long ll;
int w,f;
int n;
void solve() {
    cin>>w>>f;
    cin>>n;
    priority_queue<int>q;
    for(int i=1; i<=n; i++) {
        int x;
        cin>>x;
        q.push(x);
    }
    //标记一下哪个增长的快
    int flag;
    if(w>f) flag=1;//sum1增长的快
    else flag=2;//sum2增长的快
    int cnt=0;//记录次数
    int sum1=0,sum2=0;


    while(q.size()) {
        sum1+=w,sum2+=f,cnt++;
        if(flag==1) {
            while(q.size()&&sum1>=q.top()) {
                sum1-=q.top();
                q.pop();
            }
            while(q.size()&&sum2>=q.top()) {
                sum2-=q.top();
                q.pop();
            }
        } else if(flag==2) {
            while(q.size()&&sum2>=q.top()) {
                sum2-=q.top();
                q.pop();
            }
            while(q.size()&&sum1>=q.top()) {
                sum1-=q.top();
                q.pop();
            }
        }
    }
    cout<<cnt<<endl;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

但是从第一个样例可以看成,似乎贪心并不可行,优先杀死大的并不能得到正确答案

解析:

怪兽的生命值的总和是一定的,我们选择一部分用水杀死,一部分用火杀死

然后具体哪些用水杀死,我们枚举所有的组合,相当于背包问题,选择哪些成为一个组合

假设生命值和为x用水杀死,生命值和为y用火杀死

那么次数即为max(x/w+(x%w!=0),y/f+(y%f!=0)),然后每次取min即可

法一:

枚举所有的组合可以用bitset,可以组合出的血量标记为1

首先,b[0]初始化为1,然后对于一个怪兽的生命值a,b|=b

由此,假设第一个怪兽的生命值为2,第二个怪兽的生命值为5,第三个怪兽的生命值为6,那么第0,2,5,6以及2+5,2+6,5+6位都标记为1

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<bitset>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int w,f;
int n;
void solve() {
    cin>>w>>f;
    cin>>n;
    bitset<N>bt;
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    bt[0]=1;
    for(int i=1;i<=n;i++) bt|=bt<<a[i];
    int ans=2e9;
    for(int i=0;i<=sum;i++){
        if(!bt[i]) continue;
        int x=i/w+(i%w!=0);
        int y=(sum-i)/f+((sum-i)%f!=0);
        ans=min(ans,max(x,y));
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}

法二:

背包

dp[i][j]表示从前i个怪兽里选,总的生命值为j是否可行

for(int i=1;i<=n;i++){
    for(int j=a[i];j<=sum;j++){
        dp[i][j]|=dp[i-1][j-a[i]];
    }
}

 

然后由于dp[100][1e6]会爆空间,所以优化成一维 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1e6+10;
int a[N];
int dp[N];
int w,f;
int n;
void solve() {
    cin>>w>>f;
    cin>>n;
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    memset(dp,0,sizeof dp);
    dp[0]=1;
    for(int i=1;i<=n;i++){
        for(int j=sum;j>=a[i];j--){
            dp[j]|=dp[j-a[i]];
        }
    }
    int ans=2e9;
    for(int i=0;i<=sum;i++){
        if(!dp[i]) continue;
        int x=i/w+(i%w!=0);
        int y=(sum-i)/f+((sum-i)%f!=0);
        ans=min(ans,max(x,y));
    }
    cout<<ans<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

coderforces round 894(div.3) 的相关文章

  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • 如何在 ASP.NET Core 6.0 Web API 项目中启用 cors?

    在我的 ASP NET Core 6 0 Web API 项目中配置了 CORS 但预检请求收到 http 405 错误 换句话说 不允许使用 HTTP OPTION 看起来 cors 没有启用 我见过的例子config EnableCor
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 文件加密与解密问题

    我一直在尝试在 VC Express 2010 中加密和解密文件 我见过的所有教程和文档都需要两个FileStreams 来加密文件 一个用于读取未加密的版本 另一个用于加密 当我实际编写代码时 它不断抛出错误 告诉我它无法打开该文件 因为
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click

随机推荐

  • socks5代理ip账号密码_VMlogin中文版配置使用911S5代理

    一 911 S5代理设置 打开911 S5代理并去往 程序 Program 页面 在程序列表 program list 中随机添加一个程序 911 S5程序需要用户选择一个程序 请您不要在此处添加VMlogin 因为它会收到干扰 前往 设置
  • Dynamic Region-Aware Convolution

    旷视提出 DRConv 动态区域感知卷积 提升分类 检测 分割性能 Dynamic Region Aware Convolution 是2020年旷视在arXiv上的新论文 该论文实际上是在动态卷积 local形式 上引入了空间上的分组 从
  • 亚马逊云科技上实现 “端到端”安全

    亚马逊云科技认为 安全是构建生成式 AI 不可回避的重要议题 企业只有在 AI 旅程中做好数据 模型和应用的安全防护 才能更好地借助 AI 加速业务创新 同时在全球业务规划做好战略布局 亚马逊云科技在五大领域为用户提供全方位的云安全服务 威
  • Qt环境生成dump解决异常崩溃

    背景 对于经常使用C C 的伙伴来说 程序有问题动不动就罢工崩溃的问题简直不能太熟悉了 比如本地测试通过打包发布的release版本Qt程序 在客户环境下仍可能出现异常崩溃的问题 一般通过客户反馈以及分析系统运行日志 问题基本都能够得到快速
  • 洛谷表达式求值

    题目描述 给定一个只包含加法和乘法的算术表达式 请你编程计算表达式的值 输入输出格式 输入格式 一行 为需要你计算的表达式 表达式中只包含数字 加法运算符 和乘法运算符 times 且没有括号 所有参与运算的数字均为 000 到 231 1
  • CentOS 7下启动、关闭、重启、查看MySQL服务

    1 启动命令 root xufeng Desktop service mysqld start Redirecting to bin systemctl start mysqld service 2 关闭命令 root xufeng ser
  • 栈系列之 递归实现一个栈的逆序

    算法专题导航页面 算法专题 栈 栈系列之 栈排序 栈系列之 最小栈的实现 栈系列之 用栈实现队列 栈系列之 递归实现一个栈的逆序 题目 使用递归来完成一个栈的逆序操作 其他限制 不能借助任何其他数据结构 图示 无 分析 递归思想原本就和栈这
  • 力扣第五十三道最大子数组和

    题目 给你一个整数数组 nums 请你找出一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 子数组 是数组中的一个连续部分 输入 nums 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和
  • Exploring Large Language Models for Knowledge Graph Completion

    本文是LLM系列文章 针对 Exploring Large Language Models for Knowledge Graph Completion 的翻译 探索用于知识图谱补全的大型语言模型 摘要 1 引言 2 相关工作 3 方法 4
  • C/C++中的日期和时间

    C C 中的日期和时间 撰文 周翔 摘要 本文从介绍基础概念入手 探讨了在C C 中对日期和时间操作所用到的数据结构和函数 并对计时 时间的获取 时间的计算和显示格式等方面进行了阐述 本文还通过大量的实例向你展示了time h头文件中声明的
  • 数据结构---单链表的增删改查(C语言实现)

    链表的创建 链表元素插入 头插 尾插 指定位置插入 链表元素的删除 链表元素的查看 1 链表的创建 有头链表 有头链表的创建就是创建一个头结点代表此链表 用一个结构体指针指向头结点 通常称为头指针 方便找到此链表 头结点的数据域一般不做处理
  • 软件测试笔记(五)- 动态黑盒测试

    了解在没有代码的情况甚至不懂得编程的情况下的软件测试技术 一 动态黑盒测试 戴上眼罩测试软件 不深入代码细节测试软件的方法称为 动态黑盒测试 它是动态的 因为程序在运行 软件测试员像用户一样使用它 同时 它是黑盒子 因为测试时不知道程序如何
  • STViT-R 代码阅读记录

    目录 一 SwinTransformer 1 原理 2 代码 二 STViT R 1 中心思想 2 代码与原文 本次不做具体的训练 只是看代码 所以只需搭建它的网络 执行一次前向传播即可 一 SwinTransformer 1 原理 主要思
  • H5C3部分面试题汇总

    1 HTML和HTML5 CSS和CSS3相比 有什么变化 HTML5中新增的内容有 自定义属性 data id 语义化更好的内容标签 header nav footer aside article section 音频 视频标签 audi
  • 复习之linux系统中的软件管理

    一 linux系统中软件包 1 软件包的类型 注意在rhel8中只能使用绿色软件 源码编译软件和rpm软件 类型 支持的条件 DEB UBlinux DEBlinux 用不了 RPM redhat centOS fadora bz2 gz
  • 栈破坏的分析

    在程序运行中 栈主要用来保存局部变量 函数参数 函数调用的返回地址以及栈底 以x86为例 与栈关系比较大的几个寄存器主要是 ebp 基址指针寄存器 extended base pointer 其内存放着一个指针 该指针永远指向系统栈最上面一
  • jvm-04运行时数据区(方法区)

    1 堆 栈 方法区的交互关系 运行时数据区结构图 堆 栈 方法区的交互关系 2 方法区的理解 Java虚拟机规范 中明确说明 尽管所有的方法区在逻辑上属于堆的一部分 但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩 但对于HotSpo
  • QSPI协议详解(二)

    1 QSPI协议简介 QSPI是Queued SPI的简写 是Motorola公司推出的SPI接口的扩展 比SPI应用更加广泛 在SPI协议的基础上 Motorola公司对其功能进行了增强 增加了队列传输机制 推出了队列串行外围接口协议 即
  • Linux和Windows中下载FFmpeg

    Linux和Windows中下载FFmpeg 注意 在Linux下下载FFmpeg 必须要让 usr local ffmpeg中的目录为空 否则无法生成新的版本内容 我就是了 1 Linux下 1 打开官网 点击Download 然后点击L
  • coderforces round 894(div.3)

    Problem A Codeforces AC代码 include