首页 > 其他分享 >暑假集训D10 2023.8.3 补题

暑假集训D10 2023.8.3 补题

时间:2023-08-04 09:11:45浏览次数:41  
标签:骰子 D10 dice int res create long 补题 2023.8

D.DnD Dice

给出分别有不同个数的 \(4,6,8,12,20\) 面骰子, \(k\) 面骰子的每个面的点数分别是 \(1~k\) .

问用上所有骰子能组合出来的情况的概率从大到小排序,如果有相同的可能性的情况,按任意顺序即可.

\(\operatorname{Solution}\)

可以将骰子两两合并,合并后的骰子大小为 \([min_a+min_b,max_a+max_b]\) , 对合成后的新骰子点数一定 \(\in [min_a+min_b,max_a+max_b]\) ,并且有 $f[i+j] = f[i] \times f[j] $. 其中 \(f[i]\) 表示某个骰子掷到 \(i\) 的概率(特别地,对于一个没有合成过的骰子,概率是 \(1\div n\),其中 \(n\) 为该骰子的面数).由于最后合成一个大骰子,某一点数 \(i\) 概率一定是所有可能的情况总数之和除以所有合并前的小骰子面数之积,所以计算概率时可以不除骰子的面数.

最后合并到只剩余一个骰子就可以了.

这道题会爆 \(long\ long\) ,需要开 \(double\).

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<double,double> PII;
PII r [1000000];
struct dice
{
	double v[10000] = {0};
	int minv;
	int maxv;
};
dice create(int x)
{
	dice t;
	for (int i = 1; i <= x; i++)
	{
		t.v[i] = 1;
	}
	t.maxv = x;
	t.minv = 1;
	return t;
}
dice add(dice a, dice b)
{
	dice t;
	t.minv = a.minv + b.minv;
	t.maxv = a.maxv + b.maxv;
	for (int i = a.minv; i <= a.maxv; i++)
	{
		for (int j = b.minv; j <= b.maxv; j++)
		{
			t.v[i + j] += a.v[i] * b.v[j];
		}
	}
	return t;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	queue<dice> q;
	int x;
	
	dice a, b, c, d, e;
	a = create(4);
	b = create(6);
	c = create(8);
	d = create(12);
	e = create(20);
	cin >> x;
	for (int i = 1; i <= x; i++)
	{
		q.push(a);
	}
	cin >> x;
	for (int i = 1; i <= x; i++)
	{
		q.push(b);
	}
	cin >> x;
	for (int i = 1; i <= x; i++)
	{
		q.push(c);
	}
	cin >> x;
	for (int i = 1; i <= x; i++)
	{
		q.push(d);
	}
	cin >> x;
	for (int i = 1; i <= x; i++)
	{
		q.push(e);
	}
	
	while (q.size() > 1)
	{
		dice a = q.front();
		q.pop();
		dice b = q.front();
		q.pop();
		dice t = add(a, b);
		q.push(t);
		// sort(res.v+res.minv,res.v+res.maxv+1,greater<int>());
		// for (int i = res.minv; i <= res.maxv; i++)
		// {
		//     cout << res.v[i] << ' ';
		// }
		// cout<<endl;
	}
	dice res = q.front();
	

	int idx =0;
	for (int i = res.minv; i <= res.maxv; i++)
	{
		r[idx++] = {res.v[i],i};
		//cout <<i<<": " <<res.v[i] << ' ';
	}
	sort(r,r+idx,greater<PII>());
	for(int i= 0;i<idx;i++)
	{
		cout<<r[i].second<<" ";
	}
	
	return 0;
}

B.Balloon Darts

如果给出三个点的坐标,如何方便地判断三点共线?

三个点构造两个向量 \(A,B\) ,向量叉积 \(|A \times B|\) = \(x_1y_2 - x_2y_1\) ,结果为 \(0\) 则说明 \(A\) 与 \(B\) 平行

最开始给出 \(k=3\) 条直线,最开始所有的点都为未匹配到直线的点.

每次递归地处理.

首先随机地选出两个点构成一条直线,然后对剩下所有未匹配的点挨个检查是否在这条线上.如果不在这条线上,则标记.

然后进入下一层循环 \(k-1\) .

标签:骰子,D10,dice,int,res,create,long,补题,2023.8
From: https://www.cnblogs.com/oijueshi/p/17604448.html

相关文章

  • 2023.8.3
    早上起来买了17号的火车票18号早上就能到学校,时间过去好快啊不到两个星期就回去了,明天打算回去老家再玩玩,这边太无聊了,下午看了看新出的动漫,技术炸裂,真的是国产之光,晚上一如既往地写了会儿pta看了会儿java就睡了。......
  • 2023.8.3
    今天去看了花式栈溢出的stackpivoting,前面没怎么卡壳,倒是后面exp里payload的最后最后两部分汇编指令搞卡壳了,刚开始用本就没正式学过所以一知半解的汇编知识去分析,结果没分析出来,反而越分析越迷惑,无奈之下去查几个汇编指令的详细执行流程(如jmp,ret,leave),中间还又去找博客详细了解......
  • 2023.8.3 训练
    A有一个01矩阵,求最少取反若干矩阵,使得存在一条由左上到右下仅为0的路径,且只能向下向右走。设\(f(i,j,0/1)\)表示走到\((i.j)\),且那个点为0/1的最小值。用\(f(i-1,j),f(i,j-1)\)更新\(f(i,j)\)即可。B[AGC010C]Cleaning有一棵树,每次可以选择连接两个叶子的路......
  • 2023.8.3
    学习java中的类面向对象与面向过程面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象:强调具备了功能的对象,以类/对象为最小单位类与对象的关系类:对一类事物的描述,是抽象的、概念上的定义对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)面向对象......
  • 2023.8.3 周四:SQL
    1#SQL语句可以单行或者多行书写,以分号结尾2#MySql数据库的SQL不区分大小写,关键字建议使用大写3#注释:4#单行注释:--注释内容或者#注释内容(MySQL特有)5#多行注释:/*注释内容*/67/*8DDL:操作数据库,表等;9DML:对表中的数据进行增删改;10DQL:对表中......
  • 2023.8.2 翻转卡片游戏
    坑点注意:x不能与任意一张卡片的正面数字相同,包括自己。因此如果一张卡片正反面数字相同,必然不可能是x。暴力由于\(n\leq1000\),因此\(n^2\)暴力是可以过的。遍历每一个\(nums[i]\),判断其正反面是否相同,相同则跳过,不相同则进一步检验。分为两种情况,一是取\(fronts[i]\),另一种是......
  • 2023.8.2
    今天去把之前学的SROP的东西从头梳理了一遍,然后记到了笔记本上,记完之后,我感觉基本上这一块的内容也算是彻底搞明白了。明天开始看花式栈溢出,可能之后还有别的事情要忙,我尽量每天都能花一些时间在网安的学习上。......
  • 暑假集训D9 2023.8.2 补题
    A.「EZEC-10」排列排序给你一个长度为\(n\)的排列\(p_1,p_2,\cdots,p_n\)。你需要把它排序。每次可以花区间长度,即\(r-l+1\)的代价,选择排列中的任意一段区间\([l,r]\),并将\([l,r]\)从小到大排序。现在你可以让他进行若干次这个操作,直到\(p\)中元素的值从\(1\)到......
  • [解题报告] 2023.8.2 dp专题练习赛
    比赛链接:Link[团队私有]T1:https://www.cnblogs.com/SXqwq/p/17600671.htmlT2:https://www.cnblogs.com/SXqwq/p/17601007.htmlT3:完全背包板子T4:https://www.cnblogs.com/SXqwq/p/17601622.html......
  • 2023.8
    1.GoodSubsegments这个已经是典中典题了。首先考虑一个段合法等价于\(mx-mn=r-l\),也就是\(mx-mn-r+l=0\),而且注意到\(mx-mn-r+l\ge0\),所以如果我们全局询问的话,那就是扫描线维护,然后维护一下全局的最小值以及最小值个数就行了。然后区间的子区间计数就考虑套维护历......