Polycarpus‘ Dice CF534C 泡利的骰子 详细 翻译

原题链接 位于CodeForcesicon-default.png?t=M5H6https://codeforces.com/problemset/problem/534/C

题目

        泡利有n个骰子d1,d2,...dn。第i个骰子能显示的点数为1到di。泡利扔出所有的骰子并且点数总和为A。阿格里并不能看到每个骰子的点数,但她知道总和A与每个骰子的最大点数d1,d2,...dn。不过她认为这已经能让她得到以下结论:第i个骰子不能为r。比如当泡利有两个六面的骰子并且总点数为11时,阿格里能确定每个骰子的点数都不能小于5(不然的话另一个骰子的点数就要至少为7了,这当然不可能)

        对于确定的总点数A,我们都要找出每一个骰子不可能得到的点数。

输入

第一行包含两个整数n,A( 1 ≤ n ≤ 2·10^5, n ≤ A ≤ s),骰子的数量与它们的总点数。并且s为所有骰子的最大点数和。

第二行包含n个整数d1,d2,...dn (1 ≤ di ≤ 10^6),di就是第i个骰子的最大点数。

输出

打印n个整数b1, b2, ..., bn,bi就是第i个骰子不能得到的点数的个数。

样例

输入

2 8
4 4

输出

3 3 

注意:每个骰子都不能为1,2,3

输入

1 3
5

输出

注意:骰子不能为1,2,4,5

输入

2 3
2 3

输出

0 1 

注意:第一个骰子不管是什么(1或2),第二个骰子都有可能使总点数为3

第二个骰子不能为3,否则不管第一个骰子为1或是2都会使总和大于3,即不等于3

 其实这个题目只需要得出两个式子

即 不管其他骰子的点数如何 都会使点数总和小于A的点数个数

和 不管其他骰子的点数如何 都会使点数总和大于A的点数个数

要求第一条,只需要将A减去其他骰子所能达到的最大点数,就是这个骰子所需要的最小点数,只要比这个点数小,那么就是不可能取到的点数

要求第二条,只需使在所有其他骰子都是最小点数即1的情况下,这个骰子的点数仍使总和大于A即可

两者相加就是所有不能取到的点数的个数了!

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
 // 骰子不可能的取值

int num[200010]; // 骰子的最大值

int main()
{
    int i, j;
    long long n, A;
    long long sum = 0;

    scanf("%lld%lld", &n, &A);

    for (i = 0; i < n; i++)
    {
        scanf("%d", &num[i]);
        sum += num[i];
    }

    long long ans;
    long long t;
    for (i = 0; i < n; i++)
    {
        t = A - (sum-num[i]) - 1; // 第一条要求
        ans = t>0?t:0;
        t = num[i] - (A-(n-1)); // 第二条要求
        ans += t>0?t:0;
        cout << ans << ' ';
    }

                //getchar();getchar();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是模拟掷骰子的C语言详细设计: 1. 任务说明 本任务要求设计一个程序,模拟掷骰子的过程。程序将随机生成一个1~6之间的数作为骰子的点数,并输出点数。程序将重复执行,直到用户选择退出。 2. 程序流程 2.1 初始化:程序开始运行时,需要初始化随机数生成器,以确保每次掷骰子的结果是随机的。 2.2 循环执行:程序将进入一个循环结构,每次循环中,程序将生成一个随机数,模拟掷骰子的过程,并输出点数。用户可以选择继续掷骰子或退出程序。 2.3 退出程序:当用户选择退出程序时,程序将结束循环,输出“Goodbye!”并退出程序。 3. 数据结构 本程序不需要使用复杂的数据结构,只需使用一个整型变量存储骰子的点数即可。 4. 函数设计 本程序只需要一个主函数即可。 4.1 初始化随机数生成器 函数名:init_rand() 函数功能:初始化随机数生成器 函数输入:无 函数输出:无 函数实现: void init_rand() { srand(time(NULL)); // 使用系统时间作为随机数种子 } 4.2 模拟掷骰子过程 函数名:roll_dice() 函数功能:模拟掷骰子过程,随机生成一个1~6之间的数作为骰子的点数 函数输入:无 函数输出:骰子的点数 函数实现: int roll_dice() { return rand() % 6 + 1; // 生成1~6之间的随机数 } 4.3 主函数 函数名:main() 函数功能:程序入口,循环执行掷骰子过程,直到用户选择退出程序 函数输入:无 函数输出:0(表示程序正常结束) 函数实现: int main() { char choice; int dice; init_rand(); do { dice = roll_dice(); printf("You rolled a %d.\n", dice); printf("Roll again? (y/n) "); scanf("%c", &choice); getchar(); // 清除输入缓冲区 } while (choice == 'y' || choice == 'Y'); printf("Goodbye!\n"); return 0; } 5. 总结 本程序使用了随机数生成器和循环结构,模拟了掷骰子的过程。程序简单易懂,代码量较少,适合初学者练习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值