排列组合&区间计数

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

Poj 1850 Code

题意:由最多8位的小写字母组成的单词(每个单词各个位置上的字母按照升序排列)先按长度排序再按照字典序排列,先给出一个单词,问此单词的排名;

解法:首先求出长度小于l该单词长度的单词的个数。然后开始统计相同长度且排在前面的单词数,从第一个字母开始,对于每个字母x,求出第i为是x前面的字母时能组成多少单词。。。

int res=0,len=s.length(),last=-1;	
		for(int i=1;i<len;i++){
			if(s.charAt(i)<=s.charAt(i-1))
			{
				System.out.println(0);
				return;
			}
			res+=c[26][i];
			}
		for(int i=0;i<len;i++){
			int k=s.charAt(i)-'a';
			if(k==0){
				last=k;
				continue;
				}
			for(int j=last+1;j<k;j++)
				res+=c[26-j-1][len-i-1];
			last=k;
		}
Poj 1715 Hexadecimal Numbers

题意:为第x大的十六进制数是几(这里的十六进制数至多8位且各位各不相同)

解法:首先依次统计长度为i的十六进制数有多少个然后确定第x大的十六进制是几位。然后依次确定每一位(思路和确定位数相似,枚举若此位是目前可用的第i大的数字时有多少种组合,直至叠加只和大于x)

String hex[] = { "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
			"B", "C", "D", "E", "F" };
	boolean vis[] = new boolean[17];

	int kth(int k) {
		int i = 0, j;
		for (j = 1; j <= 16; j++)
			if (!vis[j] && ++i == k)
				break;
		return j;
	}

	void run() {
		init();
		int k = scan.nextInt();
		Arrays.fill(vis, false);
		int m = 0, sum = 0;
		for (m = 8; m > 0; m--) {
			sum += num[m];
			if (sum >= k)
				break;
		}
		if (m < 8)
			k -= (sum - num[m]);
		String ans = "";
		for (int i = m; i > 0; i--) {
			int j;
			sum = 0;
			for (j = 16 - m + i; j > 0; j--) {
				sum += a[16 - m + i - 1][i - 1];
				if (sum >= k)
					break;
			}
			sum -= a[16 - m + i - 1][i - 1];
			int temp = kth(j);
			ans += hex[temp];
			vis[temp] = true;
			k -= sum;
		}
		System.out.println(ans);
	}

Poj 2282 The counting problem

题意:统计位于x和y之间的正整数,0---9出现了多少次。

解法:求1---n中各个数出现的次数,然后相减。对于一个数n和要统计的i,分别求i位于n的个位十位百位。。。时出现的次数,对于一个数n分成XjY三部分,j表示当前要统计的为的值,X表示当前位之前的值,Y表示当前位之后的值。根据i和j的大小关系便可以确定组合数。注意对于0的统计要稍微处理一下,since 不能有前导0。

long count(String s,int k){//统计1--s中k出现的次数		
		long ans=0;
		int len=s.length();
		for(int i=0;i<len;i++){
			int x=0,y=-1;
			int key=Integer.parseInt(s.substring(i,i+1));
			if(i>0)
			 x=Integer.parseInt(s.substring(0,i));
			if(i<len-1)
			 y=Integer.parseInt(s.substring(i+1,len));
			if(k==0)
				x--;
			if(key<k)
				ans+=x*Math.pow(10, len-i-1);
			if(key==k){
				if(i==len-1)
					y++;
				ans+=x*Math.pow(10, len-i-1)+y+1;
			}
			if(key>k)
				ans+=(x+1)*Math.pow(10, len-i-1);
			
		}
		return ans;
	}

洛谷P1980 [NOIP2013 普及组] 计数问题(用一层循环解决双重循环的问题) 用一层循环解决双重循环的问题,运用排列组合的思想,以位为单位,大大减少了时间复杂度——计数问题 阅读详情

相关推荐

windows系统下,如何为comfyui如何安装triton

​ 有些加速插件、模型在安装的时候,比如说sageattention的安装,就需要提前安装triton这个包,不过这个包有点特殊,windows下略微不好装,经常会装失败。 🎠如何安装 之前也有人介绍过,要到github上找个wheel文件,找到对应的版本安装下就好了。 问题是:https://github.com/woct0rdho/triton-windows/releases 这个git地址上,已经找不到wheel文件了... ​

聚梦小课堂 4280

贪心算法——区间问题——区间选点(最大不相交区间数量)、区间分组、区间覆盖

贪心 选择当前最优情况,通过局部最优解找到全局最优解 区间问题常见思路: 排序:按左端点/右端点/双关键字排序 区间排序 步骤: 1.将每个区间按照右端点从小到大排序 2.从前往后枚举每个区间 如果当前区间已经包含点,换下一个区间 如果当前区间不包含点,尽量选取区间后面的点 #include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; const int N=1e5+10; struct Range{ int

weixin_45627369的博客 905

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6085

CCF201809-2 买菜

试题编号: 201809-2 试题名称: 买菜 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,...

逐梦者 6960

51Nod-1962-区间计数

ACM模版描述题解官方题解: 代码#include <iostream>#define mp make_pairusing namespace std;typedef long long ll; typedef pair<int, int> pii;template <class T> inline void scan_d(T &ret) { char c; ret = 0;

逐梦者 1347

分配数字(区间统计)

分配数字  Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 6   Accepted Submission(s) : 2 Font: Times New Roman | Verdana | Georgia  Font Size: ...

Simone chou... 382

CodeForces - 612D (排序+区间计数+扫描线 区间覆盖)

题目链接:http://codeforces.com/problemset/problem/612/D题目大意:给出n条线段,让你算这些线段重合次数大于等于k次的部分输入:第一行:给出两个数n k 分别表示要输入的线段个数和所需的线段最少重叠次数接下来n行 每行一个l r表示线段的左端点和右端点。解题思路:至于这道题:区间覆盖问题 ,先把...

dengyan1183的博客 271

poj3252(排列组合计数,数位计数

/* translation: 给出两个数,求这两个数形成的闭区间内round number的个数。一个数转换成二进制的时候其中0的个数比1多的 或者相等的称为round number。 solution: 排列组合。 要求闭区间内的round number个数,只需要求出0~s的个数和0~t的个数,将二者相减即可得到答案。 关于个数的计算,可以采用如下方法。当一个数为n位的二进制时,只

林伏案的博客 505

数据结构与算法-动态规划-数位dp(计数问题,度的数量,数字游戏,windy数,数字游戏2,不要62,恨7不成妻)

假设当前处理到第 pos 位,若当前位数字为 i,且前面状态为 state,根据问题的规则,可能会转移到新的状态 new_state,那么 dp[pos][new_state] 就需要根据 dp[pos - 1][state] 进行更新。例如,规定一个数字的首位不能为 0,且相邻数位的差值不能超过 2,求满足条件的数字个数。示例说明:当X=15,Y=20,K=2,B=2时,17=2^4+2^0,18=2^4+2^1,20=2^4+2^2 这三个数满足条件,即区间内满足条件的整数个数为3。

2401_84910613的博客 1670

hdu 5151区间dp+排列组合

这道题主要对给定限制条件的利用,然后利用排列组合的知识进行求解,我们通过枚举最后一个填满的点来进行计数,并通过排列组合中的乘法原则简化计数次数 #include #include #include #include #define MOD 1000000007 #define MAX 107 using namespace std; int n; int mark[MAX]; lon

llin-黎辰 652

E - 最值区间计数

求出长度为 n 的所有排列中所有最大值为 n 且最小值为 1 的子区间个数, 对998244353 取模。

obss666的博客 156

k倍区间--蓝桥杯

评测地址:https://www.lanqiao.cn/problems/97/learning/ 一、问题描述 给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i &lt;= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。   你能求出数列中总共有多少个K倍区间吗? 输入格式   第一行包含两个整数N和K。(1 &lt;= N, K &lt;= 100000)   以下N行每行包含一个整数Ai。(1 &lt;= Ai &lt;= 10

带带我咯的博客 487

蓝桥杯——K倍区间(JAVA)

给定一个长度为 N 的数列,A1​,A2​,⋯AN​,如果其中一段连续的子序列Ai​,Ai​+1,⋯Aj​ ( i≤j ) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?

qq_63746090的博客 983

最值区间计数(思维)

计算长度为 n 的所有排列中所有最大值为 n 且最小值为 1 的子区间个数,对 998 244 353取模。那么我们把lr放在四个位置的最左最右,中间的两个位置放1和n,那么就形成了一个满足题意的lr的区间。但是因为这四个位置我们是最后处理的,所以我们要去掉这四个位置全排列的情况:(n+2)!思路:我们用lr来代表我们选的区间的左右边界,先把1和n这两个数拿出来,那么有n-2个数。然后我们再把lr和1,n算成四个位置,那么一共有n+2个位置。因为最后的1和n的位置有两种情况,那么最后再*2。

qq_61903556的博客 316

K倍区间-C++题解

给定一个长度为 N 的数列,A1, A2,…AN​,如果其中一段连续的子序列 Ai,Ai+1⋯Aj​ ( i ≤j ) 之和是 K 的倍数,我们就称这个区间 [i, j]是 K 倍区间。你能求出数列中总共有多少个 K倍区间吗?

m0_49619206的博客 625

[2019 牛客CSP-S提高组赛前集训营4题解] 复读数组(数论)+ 路径计数机(数上DP)+ 排列计数机(线段树+二项式定理)

牛客的题果然

1281

Maximum Palindromes (逆元,排列组合

题目链接 利用前缀和求出对应区间每个字母的个数 要求排列组合数为,字母总数的阶乘 除以 每个字母数目的阶乘的乘积,若有字母数目个数为奇数,再乘以数目为奇数的字母个数 将除以得到乘积,转变为乘以该数取模mod的逆元 根据结论:若b,m互质,则b模m的乘法逆元为 b^(m-2) 再利用快速幂求出乘法逆元 #include &lt;bits/stdc++.h&gt; using namespace std; typedef long long LL; const LL N = 2e5 + 10; const

Ditto_xff的博客 233

Sit sit sit HDU - 5151 (区间dp +组合计数

这道这道区间DP,我也开始觉得其实区间DP是一种应用型的思想,做这类题目一个重要的点是在于题目情景的把握,这道题的一个情景就是数学的排列组合问题. 首先应用根据小区间推出大区间的思路,我们可以先固定一个位置k,k位置是最后做的位置,那么我们要算出在这种情况下符合的方法数,假如k是头或者尾,那不用说, 此时的方法为dp[i+1][j]或者是dp[i][j-1]; 假如k是有邻居的,那我们就要考虑邻...

untilyouydc 413

HDU--5396(区间dp+排列组合

做这道题的时候,想到会不会是dp,然后发现dp值 #pragma comment(linker,"/STACK:102400000,102400000") #include #include #include #include #include #include #include #include #include #include #defi

whoISVip 848

东华oj进阶52 k倍区间

AN,如果其中一段连续的子序列Ai, Ai+1, …Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。1、没注意题目的数量级,最高数字可达100000*100000,超出了int的上限,需要把sum,res都改成longlong才行,否则会丢结果。2、一开始把余数为0的单独拿出来处理,没有进行排列组合计算,事实上余数为0的也要进行排列组合计算,并且最后要把余数为0的单独加一次。这题也是学习的思路,用sum记录下前n项和,mod记下前n项和的不同余数的个数。

qq_56438269的博客 412

历届试题 k倍区间

题目 问题描述   给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i &amp;lt;= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。   你能求出数列中总共有多少个K倍区间吗? 输入格式   第一行包含两个整数N和K。(1 &amp;lt;= N, K &amp;lt;= 100000)   以下N行每行包含一个整数Ai。(1...

baidu_41907100的博客 719
上一篇: Poj 4047 Garden /2012金华邀请赛D题(线段树)
下一篇: SGU 263 Tower(平衡树+并查集)
kksleric
博客等级 码龄16年 49粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值