AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下
话说年后的 AtCoder 比赛怎么这么少啊(大雾
AtCoder Beginner Contest 154 题解
A - Remaining Balls
We have A balls with the string S written on each of them and B balls with the string T written on each of them.
From these balls, Takahashi chooses one with the string U written on it and throws it away.
Find the number of balls with the string S and balls with the string T that we have now.
Solution
#include <bits/stdc++.h>
using namespace std;
int a,b;
string s,t,u;
int main() {
cin>>s>>t>>a>>b>>u;
if(s==u) cout<<a-1<<" "<<b<<endl;
else cout<<a<<" "<<b-1<<endl;
}
B - I miss you...
Given is a string S. Replace every character in S with x and print the result.
Solution
算一下字符串长度即可,理论上按char读进来逐个输出应该更短
#include <bits/stdc++.h>
using namespace std;
string s;
int main() {
cin>>s;
for(int i=0;i<s.length();i++) cout<<"x";
}
C - Distinct or Not
Given is a sequence of integers \(A_1, A_2, ..., A_N\). If its elements are pairwise distinct, print YES; otherwise, print NO.
Solution
排序应该是比较优雅的方法吧,虽然感觉 std::map 会更短
不对,这 \(1024MB\)的内存,是不是暴力开桶不用压位都能过
#include <bits/stdc++.h>
using namespace std;
int a[200005],n;
int main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<n;i++) {
if(a[i]==a[i+1]) {
cout<<"NO"<<endl;
return 0;
}
}
cout<<"YES"<<endl;
}
D - Dice in Line
We have \(N\) dice arranged in a line from left to right. The \(i\)-th die from the left shows \(p_i\) numbers from \(1\) to \(p_i\) with equal probability when thrown.
We will choose \(K\) adjacent dice, throw each of them independently, and compute the sum of the numbers shown. Find the maximum possible value of the expected value of this sum.
Solution
根据期望的线性性质,很容易发现只要求个最大区间和就可以了。怎么求呢,前缀和啊。
因为没加fixed数字大时飘成科学计数法 WA 了一发,我 TM 真是个憨憨。
#include <bits/stdc++.h>
using namespace std;
int n,k,p[200005];
int main() {
ios::sync_with_stdio(false);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>p[i], p[i]+=p[i-1];
int mx=0;
for(int i=0;i+k<=n;i++) mx=max(mx,p[i+k]-p[i]);
cout<<setiosflags(ios::fixed)<<setprecision(12)<<(k+mx)*0.5;
}
E - Almost Everywhere Zero
Find the number of integers between \(1\) and \(N\) (inclusive) that contains exactly \(K\) non-zero digits when written in base ten.
\(1 \leq N < 10^{100}\),
\(1 \leq K \leq 3\)
Solution
暴力数位 dp 即可,当然可能有更简单的方法,但我觉得推推公式什么的太麻烦了,还是直接数位 dp 吧
套路性地,设 \(f[i][j]\) 表示长度为 \(i\) 的数字串,有 \(j\) 个非零数位的方案数,转移方程
\]
注意 \(i=0\) 或者 \(j=0\) 的时候需要特判一下
暴力转移预处理出 \(f[i][j]\) 后,我们来统计答案。先把 \(N\) 本身判掉,然后枚举 \(x\) 从哪一位开始比 \(N\) 小,那么这一位之前的就全部确定了(和 \(N\) 一样),这一位讨论一下是 \(0\) 和不是 \(0\) 的情况,每种情况下,这位之后的部分都只约束了非零数字的个数,求和即可得到答案。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1005;
char str[N];
int n,k,ans,f[N][5];
signed main() {
cin>>str+1;
n=strlen(str+1);
for(int i=1;i<=n;i++) str[i]-='0';
cin>>k;
f[0][0]=1;
for(int i=1;i<=n;i++) {
f[i][0]=f[i-1][0];
for(int j=1;j<=3;j++) {
f[i][j]=f[i-1][j]+9*f[i-1][j-1];
}
}
int cnt=0;
for(int i=1;i<=n;i++) {
//Calculate a[i] = 0
if(str[i]) {
if(k-cnt>=0) ans+=f[n-i][k-cnt];
}
//Calculate a[i] > 0
if(str[i]>1) {
if(k-cnt-1>=0) ans+=(str[i]-1)*f[n-i][k-cnt-1];
}
if(str[i]) ++cnt;
}
if(cnt==k) ++ans;
cout<<ans;
}
F - Many Many Paths
Snuke is standing on a two-dimensional plane. In one operation, he can move by \(1\) in the positive x-direction, or move by \(1\) in the positive y-direction.
Let us define a function \(f(r, c)\) as follows:
\(f(r,c) :=\) (The number of paths from the point \((0, 0)\) to the point \((r, c)\) that Snuke can trace by repeating the operation above)
Given are integers \(r_1, r_2, c_1,\) and \(c_2\). Find the sum of \(f(i, j)\) over all pair of integers \((i, j)\) such that \(r_1 ≤ i ≤ r_2\) and \(c_1 ≤ j ≤ c_2\), and compute this value modulo \((10^9+7)\).
\(1 ≤ r_1 ≤ r_2 ≤ 10^6\),
\(1 ≤ c_1 ≤ c_2 ≤ 10^6\)
Solution
首先单个答案是容易求的,根据高中数学可知 \(f(i,j) = C_{i+j}^i\)
设 \(g(i,j)\) 是它的二维前缀和,那么原答案一定可以用四个 \(g(i,j)\) 的和差表示
下面考虑如何求 \(g(i,j)\),打印一张数表看一看,很容易想到沿着 \(j\) 维度方向做差试试,观察容易得到
\]
于是得到
\]
考虑到 \(g(i,0)\) 是显然的,而 \(f(i,j)\) 很容易做单维度递推,即
\]
后者用逆元处理即可,每次逆元计算(使用快速幂方法)花费 \(O(\log n)\),于是我们可以在 \(O(n \log n)\) 时间内求出 \(\sum_j f(i,j)\),即求出了 \(g(i,j)\)
总体时间复杂度 \(O(n \log n)\)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const int mod = 1e+9+7;
ll qpow(ll p,ll q) {
ll r = 1;
for(; q; p*=p, p%=mod, q>>=1) if(q&1) r*=p, r%=mod;
return r;
}
int inv(int p) {
return qpow(p,mod-2);
}
const int N = 1e+6+5;
int f[N],g[N];
int solve(int i,int m) {
memset(f,0,sizeof f);
memset(g,0,sizeof g);
g[0]=i+1; f[1]=i+1;
for(int k=2;k<=m+1;k++) f[k]=f[k-1]*(i+k)%mod*inv(k)%mod;
for(int j=1;j<=m;j++) g[j]=(g[j-1]+f[j+1])%mod;
return g[m];
}
signed main() {
int r1,c1,r2,c2;
cin>>r1>>c1>>r2>>c2;
--r1; --c1;
cout<<((solve(r2,c2)-solve(r1,c2)-solve(r2,c1)+solve(r1,c1)%mod+mod)%mod)<<endl;
}
AtCoder Beginner Contest 154 题解的更多相关文章
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
- AtCoder Beginner Contest 177 题解
AtCoder Beginner Contest 177 题解 目录 AtCoder Beginner Contest 177 题解 A - Don't be late B - Substring C ...
- AtCoder Beginner Contest 184 题解
AtCoder Beginner Contest 184 题解 目录 AtCoder Beginner Contest 184 题解 A - Determinant B - Quizzes C - S ...
- AtCoder Beginner Contest 173 题解
AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...
- AtCoder Beginner Contest 172 题解
AtCoder Beginner Contest 172 题解 目录 AtCoder Beginner Contest 172 题解 A - Calc B - Minor Change C - Tsu ...
- AtCoder Beginner Contest 169 题解
AtCoder Beginner Contest 169 题解 这场比赛比较简单,证明我没有咕咕咕的时候到了! A - Multiplication 1 没什么好说的,直接读入两个数输出乘积就好了. ...
- AtCoder Beginner Contest 148 题解
目录 AtCoder Beginner Contest 148 题解 前言 A - Round One 题意 做法 程序 B - Strings with the Same Length 题意 做法 ...
- AtCoder Beginner Contest 151 题解报告
总的来说,这次的题目比较水,然而菜菜的我并没有把所有题目都做完,话不多说,直接来干货: A:Next Alphabet 题目链接:https://atcoder.jp/contests/abc151/ ...
- AtCoder Beginner Contest 115 题解
题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...
随机推荐
- mysql设置编码格式--支持中文
创建table的时候就使用utf8编码 在每次创建表的时候都在最后加上 character set = utf8就可以很好的支持中文 create table xxx ( id int auto_in ...
- 2019-2020-2 20175121杨波《网络对抗技术》第一周kali的安装
2019-2020-2 20175121杨波<网络对抗技术>第一周kali的安装 标签 : Linux 一.下载安装kali 1.下载kali 下载链接 打开链接进入官网后,点击Torre ...
- .net 用反射获取当前运行的程序集中的所有Controller与Action
public string InitPermission() { // 通过反射加载程序集 // var baseType = Assembly.LoadFile(@"G:\testproj ...
- 剑指offer-面试题64-求1+2+...+n-发散思维
/* 题目: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C) */ /* 思路: 递归. */ #incl ...
- 面试想拿 10K,HR 说你只值 7K,该怎样回答或者反驳?
当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫. 礼貌地说:"7K是吗?了解了.嗯~其实我对贵司的面试官印象很好.只不过,现在我的手头上已经有一份11K的offer. ...
- css3使用animation属性实现炫酷效果
animation-name 动画名称,可以有多个值,用逗号隔开,表示绑定了多个动画 animation-name属性为动画指定一个名称 animation-name兼容主流的浏览器,不过还是需要加前 ...
- mysql引擎介绍
mysql存储引擎介绍: 插拔式的插件方式 存储引擎是指定在表上的,即一个库中的每一个表都可以指定专用的存储引擎 不管采用什么样的存储引擎,都会在数据区产生对应的一个frm文件(表结构定义描述文件) ...
- 使用mongoose--写接口
定义数据模型 import mongoose from 'mongoose' mongoose.connect('mongodb://localhost/edu') const advertSchem ...
- Spring boot项目的打包发布
Eclipse打包发布项目 打包项目 首先需要将项目编译的文件删除,执行[Run As]->[Maven clean] 如果这个时候项目报错,在pom.xml文件中添加以下代码过滤掉单元测试 & ...
- oracle add_month函数
本文转自:https://blog.csdn.net/lanchengxiaoxiao/article/details/7695057 add_months 函数主要是对日期函数进行操作,举例子进行说 ...