ABC135记录
date: 2019-07-28
A - Harmony
题目大意:
给你两个不同的整数A
和B
,要求你找到一个整数K
,同时满足|A-K|=|B-K|
。找不到时,输出"IMPOSSIBLE"
题目做法:
聪明的读者读到这里肯定已经发现了,这其实就是平均数,但是,要特判A
和B
的差是奇数的情况:此时K
不是整数,所以输出"IMPOSSIBLE"
。
代码:
#include<bits/stdc++.h>
using namespace std;
int a,b;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>a>>b;
if((a+b)%2){//K不是整数
cout<<"IMPOSSIBLE"<<endl;
}else{
cout<<(a+b)/2<<endl;
}
return 0;
}
B - 0 or 1 Swap
题目大意:
有一个长度为N
的序列,内部元素为1~N
。允许最多交换一次任意一对元素的位置,把这个序列变为升序(从小到大的)序列(可以选择不交换也就是交换零次,但最多一次),可以就输出"YES"
,否则输出"NO"
。
题目做法:
暴力。由于这道题的数据范围很小,所以只要模拟交换元素就好。
我们跑一个二重循环代表交换的元素对,再在里面写一个循环判断是否有序即可。特殊地,我们需要直接判断这个序列是否有序,因为题目里说可以不交换。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[55];
bool chk(){//检查序列是否有序
for(int i=1;i<=n;i++){
if(a[i]<=a[i-1]){//其实因为是1~n的序列,可以直接写a[i]!=i判断
return false;
}
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
swap(a[i],a[j]);//模拟交换位置
if(chk()){//有序了就输出
cout<<"YES"<<endl;
return 0;
}
swap(a[i],a[j]);//check完记得换回来
}
}
if(chk()){//特殊地,判断数组一开始就有序的情况
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
return 0;
}
C - City Savers
题目大意:
有N+1
座城市,然后其中的第i
个城市有A[i]
个怪兽在,有N
个英雄,第i
个英雄可以打败在第i
和i+1
城市的怪兽,但第i
位英雄打败的怪兽不超过B[i]
个。
题目做法:
贪心。显然地,由于第i
位英雄只能影响第i
和i+1
城市,所以i
之前的城市这位英雄都不能影响,所以尽量让第i
位英雄打败第i
座城市里的怪物,打不完B[i]
个在去下一座城市。
如果第i
位英雄优先击杀第i+1
位的怪物,那么第1座城市可能会有结余,而后面的英雄因为自己的城市的怪物已经被杀掉一部分了,所以可能不能杀满B[i]
个,所以之前的做法应该是最优的。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
int b[100005];
long long ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n+1;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){//贪心的,让英雄先杀自己城市的怪物,再杀下一个城市的
if(b[i]<=a[i]){
ans+=b[i];
}else{
b[i]-=a[i];
ans+=a[i];
ans+=min(a[i+1],b[i]);
a[i+1]-=min(a[i+1],b[i]);
}
}
cout<<ans<<endl;
return 0;
}
D - Digits Parade
题目大意:
给你一个字符串S
,包含0~9
和?
。在?
中填入0~9
,使得得到的数对13
取模余5
。
可以有前导零
题目做法:
DP。由于数据范围很大,有10^5
那么大,但是13
这个数字很小,是一个突破口。于是:
我们建立一个二维数组DP
,DP[i][j]
表示计算到第i
位(第i
位还没有填入,此时i
从0
开始计算)时有多少种
对13
取模余j
的方法。正向思考,DP[i+1][(j*10+<填入的数字>)%13]+=DP[i][j]
,如果这一位是?
,那么填入的数字从1
到9
都要计算一遍。
代码:
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
string s;
int n;
int dp[100005][15];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>s;
int n=s.size();
dp[0][0]=1;
for(int i=0;i<n;i++){
if(s[i]=='?'){
for(int j=0;j<13;j++){
for(int k=0;k<10;k++){//尝试填入0~9
dp[i+1][(j*10+k)%13]+=dp[i][j];
if(dp[i+1][(j*10+k)%13]>=mod)dp[i+1][(j*10+k)%13]-=mod;//常数优化
}
}
}else{
for(int j=0;j<13;j++){
dp[i+1][(j*10+s[i]-'0')%13]+=dp[i][j];
if(dp[i+1][(j*10+s[i]-'0')%13]>=mod)dp[i+1][(j*10+s[i]-'0')%13]-=mod;//常数优化
}
}
}
cout<<dp[n][5]<<endl;
return 0;
}
其实这个常数优化并没有什么用,因为计算下标时还是需要取模。
E - Golf
我不会,所以就没有办法写了。
放张官方题解:
官方题解链接
F - Strings of Eternity
题目大意:
给你两个字符串s
和t
,问你是否有一个非负整数i
满足下列条件并且i
是有限的,如果是,那么求出i
的最大值。
条件:有一个非负整数j
,i
个t
连接起来是j
个s
连接起来的字串。
说人话(其实也是我比较喜欢的方式)就是给你两个串s
和t
,然后无限多个s
连接起来,是否可以找到有限个t
连接起来是s
的子串。如果无限多个t
都是字串,那么就输出-1
。
题目做法:
想法来自我的同学。首先,你把足够多的s
连接起来,然后每一个位置i
都查看s
从i
开始的后缀子串并记为s2
,查看t
是否是s2
的前缀。新开一个数组suf
记录是或否。然后,从后往前,做一个类似前缀和的操作,如果第i
位是1
,那么就加上第i+|t|
位的值(|t|
指t
的长度),可以在O(n)
时间内求出最长的连续的t
作为连续的s
的子串时,这个t
的连续的个数。
这个匹配操作,我们可以使用Hash
来把复杂度控制在O(n)
里(其实KMP
和Z算法
也可以实现)。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1145411919;
const int p=810;
//这么臭的哈希值应该没人会卡吧
string s,t;
int ans;
ll pw[16000005];
ll h[16000005];
ll ht[16000005];
int suf[16000005];
inline ll gh(int x){//求s中第x位开始的长|t|字符串的哈希值
if(x+t.size()>s.size())return -1;
return (h[x+t.size()-1]-h[x-1]*pw[t.size()]%mod+mod)%mod;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>s>>t;
while(s.size()<t.size()*2)s=s+s;
s=s+s;
s=s+s;
s=s+s;//构建出足够长的s
pw[0]=1;
for(int i=1;i<=16000000;i++){
pw[i]=pw[i-1]*p%mod;
}//预先求k的i次方,存入pw[i]
h[0]=s[0]-'a'+1;
for(int i=1;i<s.size();i++){
h[i]=(h[i-1]*p+s[i]-'a'+1)%mod;
}//h[i]代表s到i的hash值
ht[0]=t[0]-'a'+1;
for(int i=1;i<t.size();i++){
ht[i]=(ht[i-1]*p+t[i]-'a'+1)%mod;
}//ht[i]代表t到i的hash值
for(int i=0;i<s.size();i++){
suf[i]=ht[t.size()-1]==gh(i);
}//suf功用同上
for(int i=s.size()-t.size();i>=0;i--){
if(suf[i])suf[i]+=suf[i+t.size()];
ans=max(ans,suf[i]);
}//和做法中解释的一样
if(ans+1>=s.size()/t.size()){
cout<<-1<<endl;
return 0;
}//判断t的连接是否过多,近似无限
cout<<ans<<endl;
return 0;
}
结束语
感谢你看完,如果你想支持我,你可以登录账号,把对我的建议和意见写在下面,帮助我取得进步。
ABC135记录的更多相关文章
- 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL
在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...
- nginx配置反向代理或跳转出现400问题处理记录
午休完上班后,同事说测试站点访问接口出现400 Bad Request Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...
- Kali对wifi的破解记录
好记性不如烂笔头,记录一下. 我是在淘宝买的拓实N87,Kali可以识别,还行. 操作系统:Kali 开始吧. 查看一下网卡的接口.命令如下 airmon-ng 可以看出接口名称是wlan0mon. ...
- 2015 西雅图微软总部MVP峰会记录
2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 前端学HTTP之日志记录
前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...
- ASP.NET Core应用中如何记录和查看日志
日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...
- python+uwsgi导致redis无法长链接引起性能下降问题记录
今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...
随机推荐
- 洛谷 题解 P2645 【斯诺克】
吐槽一下这道题: 数据太水了!!! 请注意,这题如果你考虑了犯规的情况,那么你的分数...可能会和我一样,只有40分. 也就是说,这是一篇AC不了这道题的题解!!! 现在,我来讲一下这道题的正解: 两 ...
- SoC的软件开发流程,主要包含一些Linux下的操作命令
该笔记主要记录SoC的软件开发流程,主要包含一些Linux下的操作命令 1. 编写design file .c .h 2. 编写makefile 可执行文件名,交叉编译环境,compile fl ...
- ASP.NET Core开发者指南()
你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“作为 ASP.NET Core 开发者,我接下来应该学习什么?”,我把这张图作为建议 ...
- 发布一个基于协程和事件循环的c++网络库
目录 介绍 使用 性能 实现 日志库 协程 协程调度 定时器 Hook RPC实现 项目地址:https://github.com/gatsbyd/melon 介绍 开发服务端程序的一个基本任务是处理 ...
- Vue基础简介
目录 vue基础 一.导入vue 二.vue挂载点 三.vue变量 四.vue事件 五.vue文本指令 六.vue事件指令 七.vue属性指令 vue基础 一.导入vue 补充:vue的语句以及导入j ...
- HttpRunner学习5--使用variables声明变量
前言 在HttpRunner中,如果需要声明变量,可以通过关键字 variables 来完成,要引用声明的变量,则是通过 $+变量名 (如 $token )来实现.variables 可以在 conf ...
- 一起学Spring之Web基础篇
概述 在日常的开发中Web项目集成Spring框架,已经越来越重要,而Spring框架已经成为web开发的主流框架之一.本文主要讲解Java开发Web项目集成Spring框架的简单使用,以及使用Spr ...
- CAD绘图效率低?教你4个CAD绘图技巧,绘图效率提升十倍
CAD绘图一直是一个谜一样的存在,说它简单吧,很多人都无法完全精通,说它难吧,很多人也都自学成才了. 如何学好CAD绘图是个难题,但是老话说的好,只要思想不滑坡,办法总比困难多,掌握以下这些CAD绘图 ...
- UiPath Read CSV 中文乱码
问题:UiPath 读取.CSV文件时,出现中文乱码. 解决1: 修改CSV文件的编码为UTF-8 解决2: 设置Read CSV Activity的 encoding属性为csv相应的编码格式 参考 ...
- Hack the Zico2 VM (CTF Challenge)
下载链接: Download this VM here: https://download.vulnhub.com/zico/zico2.ova 端口扫描: ╰─ nmap -p1-65535 -sV ...