AtCoder Beginner Contest 153 题解

这次的AtCoder明显变水了居然我都能AK。题目质量有所下降,好多板子啊(逃

今年的第一篇博客,要是肺炎来了怕不是就是最后一篇力(呸呸呸)。

A - Serval vs Monster

题意

给你\(H\)和\(A\),问你多少个\(A\)比\(H\)大。

做法

输出\(\lceil \frac H A \rceil\)即可,可以转化为\(\lfloor \frac {H+A-1} A \rfloor\),此处\(\lceil a \rceil\)和\(\lfloor a \rfloor\)分别代表对\(a\)上取整和下取整。

程序

#include<bits/stdc++.h>
using namespace std; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); int h,a;
cin>>h>>a;
cout<<(h+a-1)/a<<endl; return 0;
}

B - Common Raccoon vs Monster

题意

给你\(H\)和\(N\),\(N\)个数组成的数组\(A\),问你数组里的数都减一次能不能把\(H\)减到\(0\)及以下。

做法

判断数组所有元素的和是否大于等于\(H\)即可。

程序

#include<bits/stdc++.h>
using namespace std; int h,n;
int a[100005]; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>h>>n;
for(int i=0;i<n;i++){
cin>>a[i];
h-=a[i];
}
if(h>0){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
} return 0;
}

C - Fennec vs Monster

C开始不解释题目意思了,大家肯定都看得懂(就是我懒)。

做法

贪心地找出HP最大的\(K\)个怪物先用技能打死,之后的只能平A了。

程序

#include<bits/stdc++.h>
using namespace std; typedef long long ll; int n,k;
int h[200005];
ll ans; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>n>>k;
for(int i=0;i<n;i++)cin>>h[i];
sort(h,h+n);
for(int i=0;i<n-k;i++){
ans+=h[i];
}
cout<<ans<<endl; return 0;
}

D - Caracal vs Monster

做法

定义一个操作是对场上当前的所有怪物都攻击一次。这样场上的怪物一直都是相同的血量,例如:

  • 开始有\(1\)只HP为\(4\)的怪物
  • 攻击\(1\)次后有\(2\)只HP为\(2\)的怪物
  • 攻击\(2\)次后有\(4\)只HP为\(1\)的怪物
  • 攻击\(4\)次后所有怪物死亡

总共\(7\)次攻击。

为什么呢?方便计算啊。只要记录场上怪物的HP和总数就好了。

之后做法显然

程序

#include<bits/stdc++.h>
using namespace std; typedef long long ll; ll h,cnt,ans; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>h;
cnt=1;
while(h){
ans+=cnt;
h>>=1;
cnt<<=1;
//>>和<<不是cincout操作符,是位运算的右移和左移,可自行查阅文档了解
//也可替换成:
//h/=2;
//cnt*=2;
}
cout<<ans<<endl; return 0;
}

E - Crested Ibis vs Monster

做法

背包板子啊,AtCoder你变力。

直接DP上,定义dp[i][j]为计算完前i个咒语造成了j点伤害最少使用的MP量。那么状态转移方程是显然的:

\[dp[i][j]=\min(dp[i-1][j],dp[i][j-a[i]]+b[i])
\]

好了,问题解决了,边界条件详见程序。

程序

#include<bits/stdc++.h>
using namespace std; int h,n;
int a[1005],b[1005];
int dp[1005][20005]; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>h>>n;
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(int i=0;i<n;i++){
cin>>a[i]>>b[i];
for(int j=0;j<=h+10000;j++){//由于可能伤害不是正好杀死,一定要预留一点伤害的量
if(j+a[i]<=h+10000)dp[i][j+a[i]]=min(dp[i][j+a[i]],dp[i][j]+b[i]);
dp[i+1][j]=min(dp[i+1][j],dp[i][j]);//此处为计算方便我正着dp了
}
}
int ans=0x3f3f3f3f;
for(int i=h;i<=h+10000;i++){
ans=min(ans,dp[n][i]);
}
cout<<ans<<endl; return 0;
}

F - Silver Fox vs Monster

做法

首先,正常人都会选择把这些怪物们按坐标排个序。

然后,我们可以看出,对于每一个怪物\(A\),我们都可以找到一个它右边的怪物\(B\),\(A\)和\(B\)可以被同一个炸弹炸到,但\(B\)右边的怪物不可以,这个可以用two pointers(中文是尺取法来着?)在\(O(N)\)时间里计算。可以看这篇博客了解。

我们就从左到右地循环怪物\(A\),每一次都炸很多次把它炸死。可以证明,此时炸弹位置在波及到\(A\)的情况下,越向右放越好,也就是波及了\(A\)到\(B\)的所有怪物。这个用线段树维护每个怪物的血量就好了。又是板子,AtCoder出题人偷懒(

程序

#include<bits/stdc++.h>
using namespace std; typedef long long ll; int n,d,a,sz;
ll data[800005];
ll lazy[800005];
pair<int,int> mon[200005]; void build(int bk,int l,int r){
if(l==r){
if(l<=n){
data[bk]=mon[l].second;
}
return;
}
build(bk<<1,l,(l+r)>>1);
build(bk<<1|1,((l+r)>>1)+1,r);
data[bk]=data[bk<<1]+data[bk<<1|1];
} void upd(int bk,int l,int r,int ql,int qr,ll val){
if(qr<l||r<ql)return;
if(ql<=l&&r<=qr){
lazy[bk]+=val;
data[bk]+=val*(r-l+1);
return;
}
lazy[bk<<1]+=lazy[bk];
data[bk<<1]+=lazy[bk]*((r-l+1)>>1);
lazy[bk<<1|1]+=lazy[bk];
data[bk<<1|1]+=lazy[bk]*((r-l+1)>>1);
lazy[bk]=0;
upd(bk<<1,l,(l+r)>>1,ql,qr,val);
upd(bk<<1|1,((l+r)>>1)+1,r,ql,qr,val);
data[bk]=data[bk<<1]+data[bk<<1|1];
} ll qry(int bk,int l,int r,int ql,int qr){
if(qr<l||r<ql)return 0;
if(ql<=l&&r<=qr){
return data[bk];
}
lazy[bk<<1]+=lazy[bk];
data[bk<<1]+=lazy[bk]*((r-l+1)>>1);
lazy[bk<<1|1]+=lazy[bk];
data[bk<<1|1]+=lazy[bk]*((r-l+1)>>1);
lazy[bk]=0;
return qry(bk<<1,l,(l+r)>>1,ql,qr)+qry(bk<<1|1,((l+r)>>1)+1,r,ql,qr);
} ll ans; int main(){ ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0); cin>>n>>d>>a;
sz=1;while(sz<n)sz<<=1;
for(int i=1;i<=n;i++){
cin>>mon[i].first>>mon[i].second;
}
sort(mon+1,mon+1+n);//读入,对怪物排序
build(1,1,sz);//建立线段树
int l=1,r=1;
while(l<=n){
while(mon[r+1].first-mon[l].first<=d+d&&r<n){
r++;
}//尺取法
ll lft=qry(1,1,sz,l,l);//cerr<<lft<<endl;
if(lft<=0){//如果怪物死了就不计算了,我还因为这个wa了一次qaq
l++;
continue;
}
ll tms=(lft+a-1)/a;//杀掉这个怪物需要多少炸弹
ans+=tms;
upd(1,1,sz,l,r,(-tms)*a);//我也不知道为什么要加上括号qaq
l++;
}
cout<<ans<<endl; return 0;
}

感谢

感谢阅读,我写得很烂您还读完了。太感谢了qaq

AtCoder Beginner Contest 153 题解的更多相关文章

  1. AtCoder Beginner Contest 154 题解

    人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...

  2. AtCoder Beginner Contest 177 题解

    AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...

  3. AtCoder Beginner Contest 184 题解

    AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...

  4. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  5. AtCoder Beginner Contest 172 题解

    AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...

  6. AtCoder Beginner Contest 169 题解

    AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...

  7. AtCoder Beginner Contest 148 题解

    目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...

  8. AtCoder Beginner Contest 151 题解报告

    总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ...

  9. AtCoder Beginner Contest 115 题解

    题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...

随机推荐

  1. POST注入之sqlmap

    POST注入方法一加—form跑数据库sqlmap.py -u http://59.63.200.79:8815/Pass-05/index.php —form —dbs跑出数据库后查询表名 假设库名 ...

  2. 清北学堂—2020.1提高储备营—Day 4 morning(数论)

    qbxt Day 4 morning --2020.1.20 济南 主讲:李奥 目录一览 1.一些符号与基本知识 2.拓展欧几里得,逆元与欧拉定理 3.线性筛法与积性函数(非重点) 总知识点:数论 一 ...

  3. visual studio2010编译过程中出现COFF文件损坏的原因和方法总结

    一.现象描述 笔者在用visual studio2010进行控制台程序进行程序编译时候,经常会遇到代码代码没有语法错误,但是编译不通过的现象.系统报错为 LINK : fatal error LNK1 ...

  4. demo Django-基础书籍添加删除(单表)

    小demo使用---- 1.pycharm-2019.2 2.python-3.7.2 3.mysql-5.7.25 4.django-2.2.4 使用过程中的一些注意事项和出现的常见错误的解决地址 ...

  5. STL-优先级队列-priority_queue

    头文件是<queue> 操作很简单 #include <iostream> #include <cstdio> #include <queue> usi ...

  6. Java求素数和

    描述 从键盘任意输入两个整数m,n,编程计算并输出m~n之间的所有素数之和. 输入 在一行上输出m和n. 输出 m和n之间(包括m和n)的素数的和 难度 一般 输入示例 2 5 输出示例 10 完成代 ...

  7. WIN10开启FTP(完整版)

    1.控制面板 --> 程序--> 启用或关闭windows功能 2.左下角搜索栏搜索IIS(iis) 3.右键添加FTP站点 4.创建站点名字和目录 5.绑定本机IP地址,SSL勾选无SS ...

  8. 第31届IMO 第2题

    题目 设n>=3,考虑一个圆上由2n-1个不同点构成的集合E.现给E中恰好k个点染上黑色,如果至少有一对黑点使得这两个黑点之间的弧上(两段弧中的某一个)包含恰好E中的n个点,就成这样的染色方法是 ...

  9. hdu 1005 Number Sequence(循环节)

    题意,f(1)=1,f(2)=1,f(n)=a*f(n-1)+b*f(n-2),求f(n)%7 这个题可能数据不够严谨,所以有些错误的做法也可以通过,比如7 7 50,应该输出0而不是1 解:找到关键 ...

  10. 51Nod 1284 2 3 5 7的倍数 (容斥定理)

    给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如N = 10,只有1不是2 3 5 7的倍数. Input 输入1个数N(1 <= N <= 10^18). Outpu ...