替小明作弊 蓝桥杯

替小明作弊

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 26   Accepted Submission(s) : 15
Font: Times New Roman | Verdana | Georgia
Font Size: ← →

Problem Description

小明参加了少年宫的一项趣味活动:每个小朋友发给一个空白的骰子(它的6个面是空白的,没有数字),要小朋友自己设计每个面写哪个数字。但有如下要求:
1. 每个面只能填写 0 至 8 中的某一个数字。
2. 不同面可以填写同样的数字,但6个面总和必须等于24。
填好后,小朋友可以用自己填写好数字的骰子向少年宫的两个机器人挑战----玩掷骰子游戏。规则如下:
三方同时掷出自己的骰子,如果出现任何相同的数字,则三方都不计分。 
如果三方数字都不同,则最小数字一方扣 1 分,最大数字一方加 1 分。 
小明看到了两个机器人手中的骰子分别是:
0 0 0 8 8 8 1/2
1 1 4 5 6 7 k n/6
请你替小明算一下,他如何填写,才能使自己得分的概率最大。
请提交小明应该填写的6个数字,按升序排列,数字间用一个空格分开。
如果认为有多个答案,提交字母序最小的那个方案。
注意:只提交一行内容,含有6个被空格分开的数字。不要写其它附加内容,比如:说明性的文字。

Input

Output

输出按升序排列的6个数字,数字间用空格分隔

Author

njtechliubin

这道题想着暴力穷举就好了,没想到自己做暴力题都会写错,总共也就6^3种可能,

再对于每种可能看他赢分的次数,次数最多就是答案。

#include<iostream>
using namespace std;
int ans[6];
int robot[6] = { 1,1,4,5,6,7 };
int robot2[6] = { 0,0,0,8,8,8 };
double win = 0;
double res = 0;
void dfs(int n,int sum) {
	if (n == 6&&sum==24) {
		win = 0;
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				for (int k = 0; k < 6; k++) {
					if (ans[i] > robot[j] && ans[i] > robot2[k]) {
						win += 1;
					}
				}
			}
		}
		if (win >res) {
			res = win;		
			cout << res << endl;
			for (int i = 0; i < 6; i++)
				cout << ans[i];
			cout << endl;
		}
		return;
	}
	if (n > 6)
		return;
	for (int i = 0; i <= 8; i++) {
		if (sum + i <= 24) {
			ans[n] = i;
			dfs(n + 1, sum + i);
		}
	}
}
int main()
{
	dfs(0, 0);
	return 0;
}

### 蓝桥杯 小明的彩灯 问题解析 #### 差分数组的概念 差分数组是一种用于高效处理区间加减操作的数据结构。对于长度为 \(N\) 的原始数组 \(A\) ,其对应的差分数组 \(D\) 定义如下:\(D[0]=A[0]\),对于所有的 \(i>0\),有 \(D[i]=A[i]-A[i-1]\)[^1]。 #### 解决方案概述 针对题目中的需求,在不使用差分数组的情况下直接模拟每次操作的时间复杂度较高,因为每一次修改都会遍历整个指定范围内的元素。而通过构建并利用差分数组,则可以显著降低时间开销。具体来说: - 初始化一个大小为 \(N+1\) 的差分数组 `diff` 和记录最终状态的结果数组 `result` 。这里多分配一位空间是为了方便处理边界情况。 - 对于每一个更新请求 \([l,r,x]\),仅需执行两次赋值语句即可完成对该区间的增量设置:`diff[l]+=x`,`if(r<N) diff[r+1]-=x`;注意这里的判断条件防止越界访问错误发生[^2]. - 接下来只需要一次线性的扫描过程来恢复实际的变化后的数值序列至 `result` 数组中去: ```cpp for(int i = 1 ; i <= N ; ++i){ result[i] += result[i-1]+diff[i]; } ``` 最后一步就是按照要求输出调整过后的各个位置上的最大非负亮度值了。 #### C++ 实现代码示例 下面是基于上述分析编写的完整程序实现: ```cpp #include <iostream> using namespace std; const int MAX_N = 1e5 + 5; int light[MAX_N], change[MAX_N]; int main(){ int n, q; cin >> n >> q; // Read initial brightness values into 'light' array. for (int i = 1; i <= n; ++i){ cin >> light[i]; } // Process each query and update the difference array accordingly. while(q--){ int l, r, val; cin >> l >> r >> val; change[l] += val; if(r + 1 <= n) change[r + 1] -= val; } // Calculate final brightness after all changes applied. int sum = 0; for (int i = 1; i <= n; ++i){ sum += change[i]; light[i] += sum; cout << max(0, light[i]) << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值