A - こだわり者いろはちゃん / Iroha's Obsession(暴力)

题目链接

题目大意:

给你 \(k\) 个个位数字和一个数字 \(n\) ,要求找到一个大于等于n的数字,使得不出现 \(k\) 个数.

大致思路:

直接枚举就行了,最多枚举到多一位。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int vis[20];
bool check(int x){
while(x){
int d=x%10;
x/=10;
if(vis[d])return 0;
}
return 1;
}
int main()
{
//freopen("H:\\c++1\\in.txt","r",stdin);
//freopen("H:\\c++1\\out.txt","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1,x;i<=k;i++)scanf("%d",&x),vis[x]=1;
for(int i=n;;i++){
if(check(i)){
printf("%d\n",i);return 0;
}
}
return 0;
}

B - いろはちゃんとマス目 / Iroha and a Grid(组合数)

题目链接

题意大意:

一个 \(H\) 和 \(W\) 的长方形矩阵,在其左下角的 \(X\) 和 \(Y\) 长方形矩阵不能走,问从左上角往下和往右到右下角的方案数 \(()(H,W<=1e5)\)

大致思路:

首先要知道,若没有不能走的格子,从 \((x1,y1)\) 走到 \((x2,y2)\) 的方案数应该是 \(C(x2+y2-x1-y1,x2-x1)\) ,我们假设左上角坐标位 \((1,1)\) ,右下角坐标位 \((H,W)\) ,那么以 \(x=X\) 为分界线,将可行部分分成两个不同大小的矩形,那么对于每一个方案必须向右穿过这个分界线,那么假设 \(y=i\) ,我们要从 \((X,i) \to (X+1,i)\) ,我们只要算出从 \((1,1) \to (X,i)\) 的方案数 \(*\) 从 \((X+1,i) \to (H,W)\) 的方案数,然后把分界线上的每一个点累加起来就可以得到答案,预处理阶乘和阶乘的逆元。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+10;
const int mod=1e9+7;
ll n,m,a,b;
ll ksm(ll a,ll b){
ll res=1,t=a;
while(b){
if(b&1)res=(res*t)%mod;
t=(t*t)%mod;
b>>=1;
}
return res;
}
ll jc[N],inv[N];
void init(){
jc[0]=inv[0]=1;
for(int i=1;i<N;i++)jc[i]=(jc[i-1]*i)%mod,inv[i]=ksm(jc[i],mod-2);
}
ll C(ll a,ll b){
return ((jc[b]*inv[a])%mod*inv[b-a])%mod;
}
int main()
{
//freopen("H:\\c++1\\in.txt","r",stdin);
//freopen("H:\\c++1\\out.txt","w",stdout);
init(); // 预处理阶乘和逆元
scanf("%lld%lld%lld%lld",&n,&m,&a,&b);
ll ans=0;
for(int i=1;i<=n-a;i++){
ll ans1=C(b-1,b+i-2); //分界线两个对应的点
ll ans2=C(m-b-1,n-i+m-b-1);
ans=(ans+ans1*ans2)%mod;
}
printf("%lld\n",ans);
return 0;
}

C - 和風いろはちゃん / Iroha and Haiku(状压DP)

题目大意:

给定 \(,,X,Y,Z\) ,要求生成一个 \(n\) 个数字的序列,每个数字为 \(1-10\) ,问所有可能的序列中满足条件:存在 \(1<=x<y<z<w<=n\) ,使得 \(\sum^{x}_{y-1}{a_i}=X,\sum^{y}_{z-1}{a_i}=Y,\sum^{z}_{w-1}{a_i}=Z\) ,的序列个数是多少。 \((X<=5,Y<=7,Z<=5,n<=40)\)

大致思路:

首先对于这种数据范围很小的题目应该要考虑状压dp来解决,首先对于一个数字 \(5\) ,我们可以用二进制 \(10000\) 来表示,对于要形成连续的三段和为 \(,,2,3,1\) 的状态可以用二进制 \(10 100 1\) 来表示,将它们拼接起来,那么对于一个序列 \(,,,2,1,2,1\) 的状态就可以用二进制 \(10 1 10 1\) ,可以发现上面 \(101001\&101101=101001\) 这就表示 \(,,,2,1,2,1\) 序列是满足连续的三段和为 \(,,2,3,1\) 的。通过这样构造我们就可以进行状态的转移了,我们应该求得是序列不满足条件的个数,最后在减去。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=(1<<18);
const int mod=1e9+7;
int dp[50][N];
int n,a,b,c;
int main()
{
//freopen("H:\\c++1\\in.txt","r",stdin);
//freopen("H:\\c++1\\out.txt","w",stdout);
scanf("%d",&n);
scanf("%d",&a);scanf("%d",&b);scanf("%d",&c);
int bz=(1<<(a-1))|(1<<(a+b-1))|(1<<(a+b+c-1));//目标状态
int mx=(1<<(a+b+c));//总共的状态数
dp[0][0]=1;//初始化
int p=1;
for(int i=1;i<=n;i++){
p=(1ll*10*p)%mod;//计算总共的方案数
for(int j=0;j<mx;j++){//枚举所有状态
if(dp[i-1][j]==0)continue;//上一个此状态无解
for(int k=1;k<=10;k++){//枚举每种方案
int now=(j<<k)|(1<<(k-1));//更新状态
now&=(mx-1);//防止溢出
if((now&bz)!=bz){//不能构成X,Y,Z
dp[i][now]=(dp[i][now]+dp[i-1][j])%mod;
}
}
}
}
int ans=p;
for(int i=0;i<mx;i++){
ans=(ans-dp[n][i]+mod)%mod;//
}
printf("%d\n",ans);
return 0;
}

D - 文字列大好きいろはちゃん / Iroha Loves Strings(暴力+dp)

题目大意:

给定 \(N\) 个字符串,选择一些字符串使得它们的总长为 \(K\) ,并且它们按照顺序拼接起来的字典序最小,保证有解。\((N<=2000,K<=1e4,len_i<=K,\sum{len_i}<=1e6)\)

大致思路:

首先必然要预处理一个\(dp[i][j]\),表示使用 \(i-n\) 的字符串能否构成 \(j\)长度的字符串,使用 \(bitset\) 优化01背包

我们将可以使用的字符串的第 \(1\) 位加入队列,对于答案的每一位进行构造,对于第 \(i\) 位必然是队列中的所有字符的最小值,接下来,更新队列,如果当前位为该字符串的结尾,那么表示我们可以将其后面的字符串的第一位加入队列,如果未到结尾就添加该字符串的后一位。

(这个做法不是正解,但是复杂度还行,正解使用了 \(exkmp\) ,有研究研究)

代码:

//这题很玄,可能会re或者wa
#include<bits/stdc++.h>
using namespace std;
bitset<10010> ok[2010];
pair<int,int> p[2][10010];
char s[2010][10010],ans[1000010];
int len[2010],n,k,cnt=0,ncnt=0;
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++) scanf("%s",s[i]+1),len[i]=strlen(s[i]+1);
ok[n+1][0]=1;
for (int i=n;i>=1;i--)
ok[i]=ok[i+1]|(ok[i+1]<<len[i]);//01背包处理可以拼成的长度
for (int i=1;i<=n;i++)
if (ok[i+1][k-len[i]]) p[0][++cnt]=make_pair(i,1);//加入,使用滚动数组
int f=0;
for (int i=1;i<=k;i++)
{
char mi='z';
for (int j=1;j<=cnt;j++) mi=min(mi,s[p[f][j].first][p[f][j].second]);//贪心选择最小字符
ans[i]=mi;
int mx=n+1;//初始化为大值
ncnt=0;
for (int j=1;j<=cnt;j++)
{
int id=p[f][j].first,pos=p[f][j].second;
if (s[id][pos]!=mi) continue;
if (pos==len[id]) mx=min(mx,id);//当前字符串结束,可以选择当前字符串后面的所以字符串
else p[f^1][++ncnt]=make_pair(id,pos+1);//继续使用这个字符串
}
for (int j=mx+1;j<=n;j++)
if (k-len[j]-i>=0&&ok[j+1][k-len[j]-i]) p[f^1][++ncnt]=make_pair(j,1);//判断是否可以用该字符串
f^=1;//
cnt=ncnt;//
}
printf("%s\n",ans+1);
}

AtCoder-arc058(题解)的更多相关文章

  1. AtCoder ExaWizards2019题解

    AtCoder ExaWizards2019题解 AtCoder (因为代码直接用模板写的,可能有点冗长) A.Regular Triangle 给你三根棍子的长度,问你能否用他们组成等边三角形. 什 ...

  2. Atcoder ARC-058

    ARC058(2020.7.4) A 从高到低依次填入能填的最小值即可. B 首先可以发现这个区间实际上只有横着的一条边有用,那么我们可以在边界上枚举中转点使得不经过非法区域即可. C 挺神的一道题. ...

  3. KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解

    KYOCERA Programming Contest 2021(AtCoder Beginner Contest 200) 题解 哦淦我已经菜到被ABC吊打了. A - Century 首先把当前年 ...

  4. AT2370 Piling Up

    https://www.luogu.org/jump/atcoder/2370 题解 答案不是\(2^{2m}\)因为每轮的第一次取球可能会不够. 我们可以设\(dp[i][j]\)表示到了第\(i\ ...

  5. Triple Shift

    来源:Atcoder ARC 136 B - Triple Shift (atcoder.jp) 题解:这道题我们不可能去硬模拟(大多数这种题都不能这样去模拟的),然后我们就要去发现特性, 发现把 a ...

  6. 重修 Slope Trick(看这篇绝对够!)

    Slope Trick 算法存在十余载了,但是我没有找到多少拍手叫好的讲解 blog,所以凭借本人粗拙的理解来写这篇文章. 本文除标明外所有图片均为本人手绘(若丑见谅),画图真的不容易啊 qwq(无耻 ...

  7. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  8. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  9. AtCoder Grand Contest 017 题解

    A - Biscuits 题目: 给出 \(n\) 个物品,每个物品有一个权值. 问有多少种选取方式使得物品权值之和 \(\bmod\space 2\) 为 \(p\). \(n \leq 50\) ...

  10. AtCoder Regular Contest 077 被虐记&题解

    直到\(7:58\)才知道今天\(8:00\)有\(AtCoder\)的菜鸡来写题解啦. C - pushpush 题目: 给定一个长为\(n\)的序列,第\(i\)次操作做如下的事 : 将\(a_i ...

随机推荐

  1. 使用 ML.NET 对 K-Means 平均值聚类分析和分类

    数据集 :https://en.wikipedia.org/wiki/Iris_flower_data_set 聚类分析 非监管式机器学习任务,用于将数据实例分组到包含类似特性的群集. 聚类分析还可用 ...

  2. 10-网页,网站,微信公众号基础入门(使用微信自带配置选项实现Airkiss配网)

    https://www.cnblogs.com/yangfengwu/p/11066036.html 如果提交失败多提交两次,只要上一节可以,,这一节一定可以的 如果没有设备 这个是我的二维码 咱就测 ...

  3. [RN] React Native 图片懒加载库 animated-lazy-image

    React Native 图片懒加载库 animated-lazy-image 官方Github地址: https://github.com/danijelgrabez/lazy-image 使用效果 ...

  4. Git常用命令与入门

    Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制..git目录位于工作目录内.对于任何一个文件, ...

  5. 【LG2839】[国家集训队]middle

    [LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\( ...

  6. 前端微服务初试(singleSpa)

    1.基本概念 实现一套微前端架构,可以把其分成四部分(参考:https://alili.tech/archive/11052bf4/) 加载器:也就是微前端架构的核心,主要用来调度子应用,决定何时展示 ...

  7. WINDOWS 命令行调用SAS代码 并指定输出路径 示例

    ECHO "设置SAS.EXE 路径" SET PATH=D:\Program Files\SASHome\SASFoundation\9.4\SAS.EXE echo " ...

  8. CV基础知识点深入理解

    BN实现: Batch Normalization学习笔记及其实现: BatchNormalization 层的实现 使用Python实现Batch normalization和卷积层 Batch N ...

  9. Unable to resolve dependency for ':app@debug/compileClasspath' could not resolve com.android.support:design:28.0.0

    使用AndroidStudio3.2报这个错 配置 解决方法 1)去掉代理 gradle目录的下代理属性也 注销掉.   2)项目的gradle设定 3)设定项目的gradle-wrapper.pro ...

  10. sigmoid与softmax 二分类、多分类的使用

    二分类下,sigmoid.softmax两者的数学公式是等价的,理论上应该是一样的,但实际使用的时候还是sigmoid好 https://www.zhihu.com/question/29524708 ...