山东理工大学第十五届ACM程序设计竞赛 R - Zyn的超能力

news/2024/10/23 9:40:12/

Description

Zyn 需要能量提高自己的超能力,有两种能量存在:超级能量和小能量。对于超级能量,Zyn 绝对不可以错过,而且努力的 Zyn 希望得到更多的小能量。

但是 Zyn 每天最多可以获得 k 次能量,而且每个能量都会在第 xi​ 天后消失,Zyn 希望你可以帮助他求出得到的小能量的最多数量。

Input

第一行包含三个正整数 n,m,k (1≤n,m≤106,1≤k≤107) 表示超级能量,小能量和每天最多可以获得能量的个数。

第二行包含 n 个整数,表示第 i 个超级能量会在第 xi​ (0≤xi​≤107) 天消失。

第三行包含 m 个整数,表示第 i 个小能量会在第 xi​ (0≤xi​≤107) 天消失。

Output

如果不能获得全部超级能量,输出"Zyn!"(不含引号),否则输出可以获得的最多的小能量的数量。

Sample

Input 

3 4 2
0 2 3
1 1 2 55 3 2
0 0 0 1 1
1 1 2

Output 

4Zyn!

Hint

题目样例为两组,由于 OJ 不支持多样例所以用回车分隔开。

样例一:可以在 44 天内获得所有小能量,

  • 第 00 天:22 个超级能量
  • 第 11 天:22 个小能量
  • 第 22 天:11 个超级能量 + 11 个小能量
  • 第 33 天:11 个小能量

总共获得 44 个小能量(33 个超级能量全部获得)

样例二:没用任何一种方法可以获得全部超级能量,输出"Zyn!"(不含引号)

考试时的思路完全错了,想得就是从前向后遍历,如果今天的超近能量大于k,则判断一下ans+k与今日超级能量的大小关系;

错误代码(当然也犯了一个致命错误,应该从0开始)

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+100;
#define endl '\n'
#define ll long long
int n,m,k;
int supper[N],small[N];
int cnt;
int cnt1[N];
int cnt2[N];
int ans;
int M;
int main()
{scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){scanf("%d",&supper[i]);cnt1[supper[i]]++;M=max(M,supper[i]);}for(int i=1;i<=m;i++){scanf("%d",&small[i]);cnt2[small[i]]++;M=max(M,small[i]);	}while(1){if(cnt>M)break;int num=k;if(cnt1[cnt]>k){if(cnt1[cnt]>k+ans){printf("Zyn!");return 0;}else{if(ans>=cnt1[cnt])ans-=cnt1[cnt];else {ans=0;num=num+ans-cnt1[cnt];}}}elsenum-=cnt1[cnt];if(num>=cnt2[cnt]){num-=cnt2[cnt];ans+=cnt2[cnt];}elseans+=num;cnt++;}printf("%d\n",ans);return 0;
}

根据截止时间的性质,按照截止时间从大到小的顺序依次枚举超级能量,判定每天剩余小能量的 数量,然后根据当天小能量的数量枚举可能的最大数量

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
#define inf 0x3f3f3f3f
int  a[N],b[N];
int n,m,k;
int maxa,maxb;
int cnt;
int ans;
int main()
{cin>>n>>m>>k;for(int i=0;i<n;i++){int x;cin>>x;a[x]++;maxa=max(maxa,x);}for(int i=0;i<m;i++){int x;cin>>x;b[x]++;maxb=max(maxb,x);}for(int i=maxa;i>=0;i--){if(a[i]>k){cnt+=a[i]-k;a[i]=k;}else if(a[i]<k){if(cnt>=k-a[i]){cnt-=(k-a[i]);a[i]=k;}}}if(cnt)//没有拿全超级能量{cout<<"Zyn!";return 0;}cnt=0;for(int i=maxb;i>=0;i--){b[i]+=cnt;cnt=0;if(b[i]){int can=k-a[i];if(can>=b[i]){ans+=b[i];b[i]=0;}else{ans+=can;b[i]-=can;cnt=b[i];b[i]=0;}} }cout<<ans<<endl;return 0;
}


http://www.ppmy.cn/news/100763.html

相关文章

【SpringCloud组件——GateWay】

前言&#xff1a; 在我们之前所用的Nacos和Feign以及Eureka&#xff0c;这些组件都是用与系统内部之间进行互相访问的&#xff0c;但是当用户访问系统时&#xff0c;我们没有采取任何措施&#xff0c;举个例子&#xff1a;系统管理员可以访问哪些接口并具备哪些操作权限&#…

【网络编程】一文详解http协议(超文本传输协议)

目录 一、http协议 1、http协议的介绍 2、URL的组成 3、urlencode和urldecode 二、http的请求方法、状态码及状态码描述、常见的响应报头 1、http请求方法 2、http状态码及状态码描述 3、http常见的响应报头 三、http协议客户端和服务器的通信过程 1、如何保证请求和…

在Node.js中接受来自命令行的输入

目录 1、简介 2、readlineSync 3、列表选择一个项目&#xff1a; 4、类似滑块范围的UI: 1、简介 如何制作一个Node.js CLI程序使用内置的readline Node.js模块进行交互 如何制作一个节点js CLI程序交互&#xff1f; Node.js 从版本7起开始提供了readline模块来执行以下操…

研究人员发现新的 ICS 恶意软件工具包旨在导致电力中断

在过去几年中&#xff0c;国家支持的攻击者一直在提高攻击电网等关键基础设施以造成严重破坏的能力。 这个武器库的新成员是一个恶意软件工具包&#xff0c;它似乎是由一家俄罗斯网络安全公司为红队演习开发的。 该恶意软件被 Mandiant 的研究人员称为 COSMICENERGY&#xff…

Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

目录 223. 矩形面积 Rectangle Area &#x1f31f;&#x1f31f; 226. 翻转二叉树 Invert Binary Tree &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

二叉树与堆的解析

数的概念与结构 线性表&#xff1a;是一种具有n个相同特性的数据元素的有限序列。线性表逻辑上是线性结构&#xff0c;也就是连成的一条直线&#xff0c;但一条直线上的数据元素并不是一定要物理结构连续的。 讲到二叉树之前&#xff0c;我们要先了解一下什么是树&#xff0c;首…

感谢十二年的陪伴——分享回归,不忘初心(Eastmount博客总结及未来规划)

曾记否&#xff0c;2021年4月28日&#xff0c;为了更好地从事科研和学习&#xff0c;当时给所有读者群发了我在CSDN唯一的私信&#xff0c;感谢大家十年的陪伴&#xff0c;短暂消失&#xff0c;不负青春。当时也收到了很多博友的鼓励与祝福&#xff0c;感恩。 是啊&#xff01…

C语言基础:翁恺笔记

英尺英寸换算米案例&#xff1a; #include <stdio.h>int main() {int inch0,foot0;printf("请输入身高的英尺和英寸\n");scanf("%d %d",&inch,&foot);printf("身高是%f米",(inchfoot/12)*0.3048);return 0; } 总结&#xff1a;…