date: 2019-07-28

A - Harmony

题目大意:

给你两个不同的整数AB,要求你找到一个整数K,同时满足|A-K|=|B-K|。找不到时,输出"IMPOSSIBLE"

题目做法:

聪明的读者读到这里肯定已经发现了,这其实就是平均数,但是,要特判AB的差是奇数的情况:此时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个英雄可以打败在第ii+1城市的怪兽,但第i位英雄打败的怪兽不超过B[i]个。

题目做法:

贪心。显然地,由于第i位英雄只能影响第ii+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这个数字很小,是一个突破口。于是:

我们建立一个二维数组DPDP[i][j]表示计算到第i位(第i位还没有填入,此时i0开始计算)时有多少种13取模余j的方法。正向思考,DP[i+1][(j*10+<填入的数字>)%13]+=DP[i][j],如果这一位是?,那么填入的数字从19都要计算一遍。

代码:

#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

题目大意:

给你两个字符串st,问你是否有一个非负整数i满足下列条件并且i是有限的,如果是,那么求出i的最大值。

条件:有一个非负整数jit连接起来是js连接起来的字串。

说人话(其实也是我比较喜欢的方式)就是给你两个串st,然后无限多个s连接起来,是否可以找到有限个t连接起来是s的子串。如果无限多个t都是字串,那么就输出-1

题目做法:

想法来自我的同学。首先,你把足够多的s连接起来,然后每一个位置i都查看si开始的后缀子串并记为s2,查看t是否是s2的前缀。新开一个数组suf记录是或否。然后,从后往前,做一个类似前缀和的操作,如果第i位是1,那么就加上第i+|t|位的值(|t|t的长度),可以在O(n)时间内求出最长的连续的t作为连续的s的子串时,这个t的连续的个数。

这个匹配操作,我们可以使用Hash来把复杂度控制在O(n)里(其实KMPZ算法也可以实现)。

代码:

#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记录的更多相关文章

  1. 记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL

    在使用FIS3搭建项目的时候,遇到了一些问题,这里记录下. 这里是发布搭建代码: // 代码发布时 fis.media('qa') .match('*.{js,css,png}', { useHash ...

  2. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  3. Kali对wifi的破解记录

    好记性不如烂笔头,记录一下. 我是在淘宝买的拓实N87,Kali可以识别,还行. 操作系统:Kali 开始吧. 查看一下网卡的接口.命令如下 airmon-ng 可以看出接口名称是wlan0mon. ...

  4. 2015 西雅图微软总部MVP峰会记录

    2015 西雅图微软总部MVP峰会记录 今年决定参加微软MVP全球峰会,在出发之前本人就已经写这篇博客,希望将本次会议原汁原味奉献给大家 因为这次是本人第一次写会议记录,写得不好的地方希望各位园友见谅 ...

  5. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  6. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  7. 前端学HTTP之日志记录

    前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两 ...

  8. ASP.NET Core应用中如何记录和查看日志

    日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...

  9. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

随机推荐

  1. Python爬虫--喜马拉雅三国音频爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Botreechan  1.进入地址我们可以发现,页面有着非常整齐的目 ...

  2. ARTS-S EN0001-In tech race with China, US universities may lose a vital edge

    原文 The U.S. is still out in front of global rivals when it comes to innovation, but American univers ...

  3. Newman

    目录 简介 安装 使用 简介 Newman是为postman而生,专门用来运行postman编写好的脚本 使用Newman,你可以很方便的用命令行来执行postman collections Newm ...

  4. 磁盘分区(GPT)

    右击 我的电脑 → 管理 → 磁盘管理 (对磁盘1进行分区)右击 磁盘1 → 初始化 磁盘1 右击 磁盘1白色部分 → 新建磁盘分区 先创建主分区(主分区最多创建4个,扩展分区最多1个) 输入分区大小 ...

  5. Java做成Zip文件,Java实现压缩文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  6. mybatis第一篇

    1.mybatis介绍 1.介绍 ​ MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  7. python 中 and or

    在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一. 一.and: 在布尔上下文中从左到右演算表达式的值,如果布尔上下 ...

  8. 记录我的 python 学习历程-Day08 文件的操作

    文件操作的初识 用 python 代码对文件进行各种操作. 基本构成: 文件路径:path 打开方式:读.写.追加.读写.写读-- 编码方式:utf-8 / gbk / gb2312-- f = op ...

  9. 使用 API 网关构建微服务-2

    「Chris Richardson 微服务系列」使用 API 网关构建微服务 Posted on 2016年5月12日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第二篇,本文将探讨: ...

  10. Python--合并2个字典成1个新字典的9种方法

    d1 = {'name': 'revotu', 'age': 99} d2 = {'age': 24, 'sex': 'male'} 输出: {'name': 'revotu', 'age': 24, ...