csp-s模拟测试10.1(b)X 国的军队,排列组合, 回文题解

题面:https://www.cnblogs.com/Juve/articles/11615883.html

X 国的军队:

好像有O(T*N)的直接贪心做法

其实多带一个log的二分也可以过

先对所有据点按b-a由大到小排序(按此方案排序后顺序扫是最优的)

然后二分答案

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=1e5+5;
inline int read(){
	re int x=0;re char ch=getchar();
	while(ch<‘0‘||ch>‘9‘) ch=getchar();
	while(ch>=‘0‘&&ch<=‘9‘){x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();}
	return x;
}
int t,n,l,r;
struct node{
	int a,b;
	inline friend bool operator < (node p,node q){
		return p.b-p.a>q.b-q.a;
	}
}c[MAXN];
inline bool check(re int x){
	for(re int i=1;i<=n;++i){
		if(x<c[i].b) return 0;
		x-=c[i].a;
	}
	return 1;
}
signed main(){
	t=read();
	while(t--){
		n=read();
		l=0,r=0;
		for(re int i=1;i<=n;++i){
			c[i].a=read(),c[i].b=read();
			l+=c[i].a,r+=c[i].b;
		}
		sort(c+1,c+n+1);
		while(l<r){
			re int mid=(l+r)>>1;
			if(check(mid)) r=mid;
			else l=mid+1;
		}
		printf("%lld\n",l);
	}
	return 0;
}

排列组合:

把$C_{n}^{i}*C_{n}^{i}$变成$C_{n}^{i}*C_{n}^{n-i}$,

这样的话,就是对于每个 i,计算 n 个中选 i 个的方案数乘上 n 个中选(n-i)个的方案数,最后累加起来。

这样得到的答案,实际上相当于 2n 个物品,在前 n 个中选 i 个,在后 n 个中选(n-i)个,、

又由于 i 取遍 0~n 所有整数,那么累加后方案数就等于 $C_{2*n}^{n}$。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=2e6+5;
const int mod=1e9+7;
int t,n,fac[MAXN],inv[MAXN];
inline int q_pow(re int a,re int b,re int p){
	re int res=1;
	while(b){
		if(b&1) res=res*a%p;
		a=a*a%p;
		b>>=1;
	}
	return res;
}
inline void get_c(re int N){
	fac[0]=fac[1]=inv[0]=1;
	for(re int i=2;i<=N;++i){
		fac[i]=fac[i-1]*i%mod;
	}
	inv[N]=q_pow(fac[N],mod-2,mod);
	for(re int i=N-1;i>=1;--i){
		inv[i]=inv[i+1]*(i+1)%mod;
	}
}
inline int C(re int n,re int m){
	if(m>n) return 0;
	if(m==n) return 1;
	return fac[n]%mod*inv[m]%mod*inv[n-m]%mod;
}
signed main(){
	get_c(2e6);
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		printf("%lld\n",C(2*n,n));
	}
	return 0;
}

回文:

定义g[i][j]表示i到j这一段是否回文,可以由g[i+1][j-1]转移:

for(int i=1;i<=len;++i){
	g[i][i]=1;
	f[i][i]=1;
	for(int j=1;j<=min(i-1,len-i);++j){
		if(s[i-j]==s[i+j]){
			g[i-j][i+j]=1;
		}else break;
	}
}
for(int i=1;i<=len-1;++i){
	if(s[i]==s[i+1]){
		g[i][i+1]=1;
		f[i][i+1]=3;
		for(int j=1;j<=min(i-1,len-i-1);++j){
			if(s[i-j]==s[i+1+j]){
				g[i-j][i+1+j]=1;
			}else break;
		}
	}
}

定义f[i][j]表示i到j这段的答案

有转移:$f[l][r]=f[l+1][r]+f[l][r-1]-f[l+1][r-1]+g[l][r]$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=5005;
char s[MAXN];
int t,len,f[MAXN][MAXN];
bool g[MAXN][MAXN];
signed main(){
	scanf("%s",s+1);
	len=strlen(s+1);
	for(int i=1;i<=len;++i){
		g[i][i]=1;
		f[i][i]=1;
		for(int j=1;j<=min(i-1,len-i);++j){
			if(s[i-j]==s[i+j]){
				g[i-j][i+j]=1;
			}else break;
		}
	}
	for(int i=1;i<=len-1;++i){
		if(s[i]==s[i+1]){
			g[i][i+1]=1;
			f[i][i+1]=3;
			for(int j=1;j<=min(i-1,len-i-1);++j){
				if(s[i-j]==s[i+1+j]){
					g[i-j][i+1+j]=1;
				}else break;
			}
		}
	}
	for(int i=2;i<=len;++i){
		for(int l=1;l<=len-i+1;++l){
			int r=l+i-1;
			f[l][r]=f[l+1][r]+f[l][r-1]-f[l+1][r-1]+g[l][r];
		}
	}
	scanf("%lld",&t);
	while(t--){
		re int l,r;
		scanf("%lld%lld",&l,&r);
		printf("%lld\n",f[l][r]);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/Juve/p/11615913.html

时间: 2024-10-15 03:59:24

csp-s模拟测试10.1(b)X 国的军队,排列组合, 回文题解的相关文章

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

APP测试10点

1.安装和卸载●应用是否可以在IOS不同系统版本或android不同系统版本上安装(有的系统版本过低,应用不能适配)●软件安装后是否可以正常运行,安装后的文件夹及文件是否可以写到指定的目录里.●安装过程中是否可以取消●安装空间不足时是否有相应提示●如果应用需要通过网络验证之类的安装,需要测试一下断网情况下是否有相应提示●是否可以删除应用(可通过桌面删除,也可以通过软件卸载安装.曾发现在IOS手相上有个应用安装时未完全安装,终止安装后,未完成安装的应用图标一直显示在手机上,并且无法成功删除)●测试

2018冬令营模拟测试赛(三)

2018冬令营模拟测试赛(三) [Problem A]摧毁图状树 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这题没想到贪心 QwQ,那就没戏了-- 贪心就是每次选择一个最深的且没有被覆盖的点向上覆盖 \(k\) 层,因为这个"最深的没有被覆盖的点"不可能再有其它点引出的链覆盖它了,而它又

2018冬令营模拟测试赛(五)

2018冬令营模拟测试赛(五) [Problem A][UOJ#154]列队 试题描述 picks 博士通过实验成功地得到了排列 \(A\),并根据这个回到了正确的过去.他在金星凌日之前顺利地与丘比签订了契约,成为了一名马猴烧酒. picks 博士可以使用魔法召唤很多很多的猴子与他一起战斗,但是当猴子的数目 \(n\) 太大的时候,训练猴子就变成了一个繁重的任务. 历经千辛万苦,猴子们终于学会了按照顺序排成一排.为了进一步训练,picks 博士打算设定一系列的指令,每一条指令 \(i\) 的效果

2018冬令营模拟测试赛(十七)

2018冬令营模拟测试赛(十七) [Problem A]Tree 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 这个数据范围肯定是树上背包了. 令 \(f(i, j, k)\) 表示子树 \(i\) 中选择了 \(j\) 个节点,路径与根的连接情况为 \(k\),具体地: \(k = 0\) 时,路径的两个端点

2018冬令营模拟测试赛(十九)

2018冬令营模拟测试赛(十九) [Problem A]小Y 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 目前未知. 这题目前就能做到 \(O(n \sqrt{M} \log n)\),其中 \(M\) 是逆序对数,然而会被卡 \(T\):当然这题暴力可以拿到和左边那个算法一样的分数,只要暴力加一个剪枝:当左

2018-10-25 模拟测试题解

目录 问题 A: 魏传之长坂逆袭 题目描述 输入 输出 样例输入 样例输出 题解 问题 B: 蜀传之单刀赴会 题目描述 [问题描述] 输入 输出 样例输入 样例输出 题解 问题 C: 吴传之火烧连营 [题目背景] [问题描述] 输入 输出 样例输入 样例输出 [样例解释] [数据规模和约定] 题解 本篇题解也发表于zwcblog作者是同一个人 问题 A: 魏传之长坂逆袭 题目描述 众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁.占有荆益.成就霸业