atc201(组合数学)+cf1400(溢水法)

C - Secret Number

题意:给你一个字符串,分别表示0-9的状态。求一个四位密码的组合有多少种。

O:表示密码一定有该数字。

X:表示密码一定没有该数字。

?:不确定密码里有没有,可能有可能没有,

思路:

按密码含几个数字的角度思考:

只由一个数字:1

只由两个数字:14 (4位2进制分别减去0000和1111两种情况)

只由三个数字:36 (肯定有一个数字出现两次,先放这个数字C(4,2),这个数字有3种可能;再放另外两个数字,一共两种可能)

只由四个数字:24 (4!)

cpp 复制代码
void solve()
{
	cin>>s;
	
	ll o=0,x=0,y=0;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='o')o++;
		else if(s[i]=='?')x++;
		else y++;
	}
	if(o==0)ans=x+14*x*(x-1)/2+6*x*(x-1)*(x-2)+x*(x-1)*(x-2)*(x-3);//别忘记惹
	if(o==1)ans=1+x*14+36*x*(x-1)/2+x*(x-1)*(x-2)/6*24;
	if(o==2)ans=14+36*x+24*x*(x-1)/2;
	if(o==3)ans=36+24*x;
	if(o==4)ans=24;
	cout<<ans;
}

C. Banknotes

思路:溢水法,一开始把所有的牌放到最小的,一直往大数上溢,不能溢了就停止。

cpp 复制代码
例如:
n=3,k=13
a0=0,a1=1,a2=3;
f(s)=14的s是答案。

i:  0   1   2
钱:1   10  100
k:  14  0   0
溢: 9   5   0

ans=9*1+5*10=59
cpp 复制代码
void solve()
{
	cin>>n>>k;
	for(int i=0;i<n;i++)cin>>b[i],a[i]=0;
	
	sort(b,b+n);
	k++;
	a[0]=k;
	for(int i=1;i<n;i++)
	{
		ll now=pow(10ll,b[i]);
		ll last=pow(10ll,b[i-1]);
		ll res=last*a[i-1]/now;
		if(res>0)
		{
			ll tmp=now/last-1;
			a[i]=a[i-1]-tmp;
			a[i-1]=tmp;
		}
		else break;
		
	}
	ans=0;
	for(int i=0;i<n;i++)
	{
		ans+=a[i]*(ll)pow(10ll,b[i]);
	}
	cout<<ans<<'\n';
}
相关推荐
爱吃rabbit的mq10 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
精彩极了吧11 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
(❁´◡`❁)Jimmy(❁´◡`❁)11 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi12 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱12 小时前
牛客网刷题(2)
java·开发语言·算法
VT.馒头12 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头12 小时前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
czy878747514 小时前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
咖丨喱14 小时前
IP校验和算法解析与实现
网络·tcp/ip·算法
罗湖老棍子14 小时前
括号配对(信息学奥赛一本通- P1572)
算法·动态规划·区间dp·字符串匹配·区间动态规划