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. 在WinDbg中显示和搜索std::vector内容

    WinDbg从来都不擅长可视化.尽管Visual Studio一直都有autoexp.dat,而且最近还出现了本机调试器可视化工具,但WinDbg用户不得不满足于转储内存区域和搜索内存来识别模式.另一 ...

  2. Android 系统Action大全

    常用Action说明: String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. “android.intent.action.ADD_SHORTCUT” String ...

  3. 第03组 Alpha冲刺(3/4)

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  4. Tomcat8.x的安装与启动

    Tomcat是企业网站的服务器,大多都用于中.小型网站开发和学习开发JSP应用程序中.笔者也是开始学习,下面介绍Tomcat8.x的安装步骤. 进入Tomcat官网,点击左边的download目录下的 ...

  5. Spark 部署即提交模式意义解析

    Spark 的官方从 Cluster Mode Overview 中,官方向我们介绍了 cluster 模式的部署方式. Spark 作为独立进程在集群上运行,他们通过 SparkContext 进行 ...

  6. X86 下的SSDT HOOK

    目录 SSDTHOOK 1.SSDTHOOK 原理. 1.x32下的SSDT HOOK 2.SSDT HOOK代码 3.结果 4.总结 SSDTHOOK 1.SSDTHOOK 原理. x32下,直接获 ...

  7. SSH登录慢解方案 - 关闭UseDNS加速

    每次登录SSH时总是要停顿等待一会儿才能连接上,,这是因为OpenSSH服务器有一个DNS查找选项UseDNS默认情况下是打开的. UseDNS 选项打开状态下,当通过终端登录SSH服务器时,服务器端 ...

  8. pytest . class

    #在当前测试类的开始与结束执行. setup_class teardown_class #在每个测试方法开始与结束执行. setup teardown #在每个测试方法开始与结束执行,与setup/t ...

  9. SpringBoot:使用Jenkins自动部署SpringBoot项目(二)具体配置

    1.启动Jenkins 在浏览器输入ip:port后,进入Jenkins初始化界面,需要查看文件,得到密码. 输入密码进入初始化界面,选择推荐插件安装. 安装完成创建账号,进入Jenkins主界面. ...

  10. jvm (一)jvm结构 & 类加载 & 双亲委托模型

    参考文档: jvm内幕-java虚拟机详解:http://www.importnew.com/17770.html 常量池:https://www.jianshu.com/p/c7f47de2ee80 ...