这三道题都水的难以想象,所以就放在一起写

1850

题目大意:有一种一种序列排列方式(如同题目中给出的例子),然后给你一个序列,问你这个序列的排名

首先我们先判断无解的情况,这个就很简单了。

由于题目给出的排列方式我们知道:若这个序列不满足一直上升的情况,那么一定无解

很好理解吧,然后我们进一步分析:在有解的情况下,如果构成这种序列的所有字符都确定了,那么它们的顺序都唯一确定了

然后我们可以求出所有长度小于这个序列的序列的总排名,即ΣC[26][i] (1<=i<len)

然后对于所有长度和它一样的序列,枚举每一位上可以使用的比他小的字符,然后组合数退一下即可

具体看代码,这个很好理解

CODE

#include<cstdio>
#include<cstring>
using namespace std;
char s[15];
int C[30][30],len,ans=1,last;
inline void init(void)
{
for (register int i=1;i<=26;++i)
{
C[i][0]=1; C[i][i]=1;
for (register int j=1;j<i;++j)
C[i][j]=C[i-1][j]+C[i-1][j-1];
}
}
int main()
{
register int i,j;
init();
scanf("%s",s+1); len=strlen(s+1);
for (i=2;i<=len;++i)
if (s[i]<=s[i-1]) { puts("0"); return 0; }
for (i=1;i<len;++i)
ans+=C[26][i]; last=1;
for (i=1;i<=len;++i)
{
int now=s[i]-'a'+1;
for (j=last;j<now;++j)
ans+=C[26-j][len-i];
last=now+1;
}
printf("%d",ans);
return 0;
}

1019

这道题我愣是没看出来和组合数的关系

题意也是给你一串序列(直接看题目),这个规律明显。让你求它的第i项是多少

裸的枚举题。我们只需要先找出所以在它之前的完整结束的序列的数字总数,然后让n减去即可得出在当前这个序列中的第几项

然后我们稍作分析:

  • 一位数0~9,共9个,占用数字9*1=9个

  • 两位数10~99,共90个,占用数字90*2=180个

  • 三位数100~999,共900个占用数字900*3=2700个

  • ......

这个规律就很显然了吧,这样我们就可以直接得出它是哪个数的第几位,最后输出即可

具体看CODE

#include<cstdio>
using namespace std;
typedef long long LL;
LL t,sum,n,num,last;
inline LL pow_10(LL k)
{
LL tot=1;
for (register LL i=1;i<=k;++i)
tot*=10;
return tot;
}
inline LL get(LL x,LL w)
{
while (w--) x/=10;
return x%10;
}
inline LL len(LL x)
{
int cnt=0;
while (x) ++cnt,x/=10;
return cnt;
}
int main()
{
register LL i; scanf("%lld",&t);
while (t--)
{
scanf("%lld",&n);
for (i=1,sum=0,last=0;;++i)
{
last+=len(i);
if (sum+last>=n) break; sum+=last;
}
n-=sum; sum=0;
for (i=1;;++i)
{
if (sum+pow_10(i-1)*9*i>=n) { num=i; break; } sum+=pow_10(i-1)*9*i;
} n-=sum;
if (!num) { printf("%lld\n",n); continue; }
if (n%num) printf("%lld\n",get(pow_10(num-1)+n/num,num-n%num)); else printf("%lld\n",get(pow_10(num-1)+n/num-1,0));
}
return 0;
}

1942

这道题是真心水,题意就是从一个方格图的左下角走到右上角的方案总数(沿着边走)

这题用递推法绝壁或超时,但是求方案数的话我们可以直接考虑这么一种想法:

首先我们观察到向右永远走n步,向上永远走m步,总步数永远是n+m

然后不同的方案本质其实就是它们的排列组合不同

然后稍加推导就是从n+m个地方里面选取n个填上数的方案数

即要求的就是:C(n+m,n)||C(n+m,m)

但是这里用阶乘的会爆精度,递推法又会超时,不过由于题目说明答案一定在unsighed int 范围内,所以我们只能用约分法

首先对于,C(n+m,n)有:

然后我们将上下都消去n!,则:

然后就可以得到:

ans=ans*(i+n)/i(1<=i<=m)

不停除下去即可,这里我们总是选取n,m中小的一个来进行循环可以快一点

CODE

#include<cstdio>
#include<cmath>
using namespace std;
long long n,m;
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(long long &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void write(long long x)
{
if (x/10) write(x/10);
putchar(x%10+'0');
}
inline void swap(long long &a,long long &b)
{
long long t=a; a=b; b=t;
}
inline long long calc(long long n,long long m)
{
long long tot=1.0;
for (register long long i=1;i<=n;++i)
tot=tot*(m+i)/i;
return tot;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
for (;;)
{
read(n); read(m);
if (!n&&!m) break;
if (n>m) swap(n,m);
write(calc(n,m)); putchar('\n');
}
return 0;
}

POJ1850&&1019&&1942的更多相关文章

  1. 【转】POJ题目分类

    初级:基本算法:枚举:1753 2965贪心:1328 2109 2586构造:3295模拟:1068 2632 1573 2993 2996 图:最短路径:1860 3259 1062 2253 1 ...

  2. 1019: [SHOI2008]汉诺塔

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1495  Solved: 916[Submit][Status] ...

  3. acm之poj题库1019方法

    认识了几个师弟,一直总想把自己的经验表达出来一些,让后面的人在更年轻的时候,认识到方向.努力. 昨天忽然想起自己在大学时候做了几天的acm,终于也没能坚持.然后就感觉带师弟们做下acm题目还是很不错. ...

  4. BZOJ 1019: [SHOI2008]汉诺塔

    Description 一个汉诺塔,给出了移动的优先顺序,问从A移到按照规则移到另一个柱子上的最少步数. 规则:小的在大的上面,每次不能移动上一次移动的,选择可行的优先级最高的. Sol DP. 倒着 ...

  5. hud 1019最小公倍数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1019 思路:头两个数先求,再用所求的数与后面的一个数求,依次类推 #include<stdlib ...

  6. Light OJ 1019 - Brush (V)(图论-dijkstra)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1019 题目大意:Tanvir想从节点1的位置走到节点n的位置, 输出最短距离, ...

  7. 【BZOJ 1019】【SHOI2008】汉诺塔(待定系数法递推)

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 559  Solved: 341[Submit][Status] ...

  8. 【BZOJ】1019: [SHOI2008]汉诺塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题意:汉诺塔规则,只不过盘子n<=30,终点在B柱或C柱,每一次移动要遵守规则:1.小的 ...

  9. 1019: A+B和C比大小

    1019: A+B和C比大小 时间限制: 1 Sec  内存限制: 128 MB提交: 518  解决: 300[提交][状态][讨论版] 题目描述 给定区间[-231, 231]内的3个整数A.B和 ...

随机推荐

  1. Linux 时间及时区设置

    时间以及时区设置 by:授客 QQ:1033553122 1.首先确认使用utc还是local time. UTC(Universal Time Coordinated)=GMT(Greenwich ...

  2. (网页)Angular.js 中 copy 赋值与 = 赋值 区别

    转自st.gg Angular.js 中 copy 赋值与 = 赋值 区别 为什么用 $scope.user = $scope.master; $scope.master 会跟着 $scope.use ...

  3. zookeeper.Net

    原文转至:http://www.cnblogs.com/shanyou/p/3221990.html 之前整理过一篇文章<zookeeper 分布式锁服务>,本文介绍的 Zookeeper ...

  4. 慕学在线网0.4_xadmin后台管理

    admin是基于Django开发的后台管理框架,方便,快捷,而且简单: 而xadmin就相当于admin的升级版,更加强大. 1.安装xadmin(源码安装方式) 教程 PS: - 卸载pip安装的x ...

  5. sqlserver 2017 docker安装(启动代理)

    从 Docker Hub 中拉出 SQL Server 2017 Linux 容器映像. docker pull microsoft/mssql-server-linux:2017-latest 运行 ...

  6. 超简单,Centos7 安装 rabbitMQ

    首先声明,本人是Linux新手一枚.经历了在阿里云Centos上部署rabbitMQ与重装的痛苦经历,后多方查找终于找到了简单方法.Linux高人来说请跳过本篇文章,新手可以试试. 1.设置Cento ...

  7. 基于Bootstrap表单验证

    基于Bootstrap表单验证 GitHub地址:https://github.com/chentangchun/FormValidate 使用方式: 1.CSS样式 .valierror { bor ...

  8. Java概述和项目演示

    Java概述和项目演示 1. 软件开发学习方法 多敲 多思考 解决问题 技术文档阅读(中文,英文) 项目文档 多阅读源码 2. 计算机 简称电脑,执行一系列指令的电子设备 3. 硬件组成 输入设备:键 ...

  9. web开发中遇到的乱码问题

    相信大家在web开发中会遇到乱码问题,有页面乱码,请求乱码,数据库乱码等等,下面我这边列举一下针对不同情况的乱码的解决方案: 1.相应数据乱码: //只需要在后台接口方法里面的开头写上这样一句话指定响 ...

  10. Android中使用databinding编译时出现的error:Execution failed for task ':app:dataBindingProcessLayoutsDebug'

    Windows环境下使用svn对AndroidStudio更新代码时,总会在源文件中出现一堆乱码,尤其是xml文件中的乱码,不仅找起来费劲,改起来更费劲. 最近从svn更新代码之后,编译时出现了下面这 ...