CodeForces 534C Polycarpus' Dice (数学)

题意:第一行给两个数,n 和 A,n 表示有n 个骰子,A表示 n 个骰子掷出的数的和。第二行给出n个数,表示第n个骰子所能掷出的最大的数,这些骰子都有问题,

可能或多或少的掷不出几个数,输出n个骰子掷不出的数的个数。

析:我们只要考虑两个极端就好,考由其他骰子投出的最大值和最小值,还有自身在最大值和最小值,作一个数学运算就OK了。公式如下:

骰子的最大值-能投的最大值+能投的最小值-1.

代码如下:

#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
using namespace std ;
typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f3f;
const double eps = 1e-8;
const int maxn = 2e5 + 5;
const int dr[] = {0, 0, -1, 1};
const int dc[] = {-1, 1, 0, 0};
int n, m;
inline bool is_in(int r, int c){
    return r >= 0 && r < n && c >= 0 && c < m;
}
int a[maxn];

int main(){
    LL sum;
    scanf("%d %I64d", &n, &sum);
    LL x = sum;
    for(int i = 0; i < n; ++i){
        scanf("%d", &a[i]);
        sum -= a[i];
    }

    for(int i = 0; i < n; ++i){
        if(i)  putchar(32);
        LL y = sum + a[i];
        LL mmax = min((LL)a[i], x-(n-1));
        LL mmin = max(1LL, y);
        printf("%I64d", a[i]-mmax+mmin-1);
    }
    putchar(10);
    return 0;
}

CodeForces 534C Polycarpus' Dice (数学)

时间: 2024-12-22 15:41:38

CodeForces 534C Polycarpus' Dice (数学)的相关文章

Codeforces 534C Polycarpus&#39; Dice 构造

题意:给你n个筛子,第 i 个筛子有 可以表示范围 1-a[i]的数,给你最后筛子和,问你每个筛子不可能的值有多少个. 解题思路:得到每个筛子的取值范围. 解题代码: 1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 00时38分58秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #includ

CodeForces 534C - Polycarpus&#39; Dice(思路)

题意:给定n (1 <= n <= 2*10^5) 个骰子,给定每个骰子最大可以掷出的最大数(最小数始终为1),给定所有骰子掷出的点数和A,求每个骰子不可能掷出的点数个数. 考虑最大和最小情况,作差即可(详情见代码注释) #include<cstdio> #include<cstring> #include<cctype> #include<cstdlib> #include<cmath> #include<iostream&g

Codeforces534C:Polycarpus&#39; Dice

Polycarp has n dice d1,?d2,?...,?dn. The i-th dice shows numbers from 1 to di. Polycarp rolled all the dice and the sum of numbers they showed is A. Agrippina didn't see which dice showed what number, she knows only the sum A and the values d1,?d2,?.

C. Polycarpus&#39; Dice

在每个位置讨论一下最大值最小值的取值范围就行 1 #include<cstdio> 2 #include<iostream> 3 #define maxn 200003 4 using namespace std; 5 typedef long long LL; 6 LL a[maxn],b[maxn]; 7 8 int main() 9 { 10 LL n,s; 11 while(scanf("%I64d %I64d",&n,&s)!=EOF)

#298 (div.2) C. Polycarpus&#39; Dice

1.题目描述:点击打开链接 2.解题思路:本题是一道数学题,很可惜在比赛时候没有注意到最大数的范围,然后被Hack了,瞬间rating变得不忍直视==.还是耐心总结,好好准备下一场比赛吧.本题要求找每个筛子不可能出现的数字的个数.可以通过确定可能值的边界来解决.假设所有筛子出现的数字之和是tot,那么每个筛子的最大范围是min(A-(n-1),num[i]),即当其他筛子都取1时的情况和筛子i自身的最大值的较小者.同理不难得到最小范围是max(1,A-(tot-num[i])).这样以来,不可能

hdu 4586 Play the Dice 数学 概率

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4586 题意: 给一个n面的骰子,每一面有一个分数,掷到的话可以得到那个分数 其中有m个面,当你掷到这些面的时候可以再掷一次 求得分的数学期望 思路: 每轮得分的期望 乘以 轮数的期望 每轮得分的期望 = 各个面的平均分 = sum / n; 轮数期望 = 1 + m/n + (m/n)^2 + ... = n - m / n 所以ans = sum / (n - m) ,其中 n!=m 要特判一些情

Codeforces 468C Hack it!(数学)

题目链接:Codeforces 468C Hack it! 题目大意:给据题目定义,找到l,r,使得solve(l,r) % a = 0. 解题思路:f(x + 1e18) = f(x) + 1,所以有solve(x + 1, x+1e18) = solve(x, x+1e18-1) + 1,假定x为0,我们求出solve(0, 1e18) % a = k,那么a - k,即为区间需要移动的步长.solve(1e18) % a = 4518 1e17 % a #include <cstdio>

Codeforces 520E. Pluses everywhere 数学

520E - Pluses everywhere/521C - Pluses everywhere Idea: Endagorion Preparation: gchebanov, DPR-pavlin Consider some way of placing all the pluses, and a single digit di (digits in the string are numbered starting from 0 from left to right). This digi

Codeforces 688D Remainders Game 数学

题意:Pari选了两个数x,k,已知k和n个数c[i],也能"知道"x%c[i],问是否x%k的值是否唯一?n,k,c[i]<=1e6 假如存在x1,x2满足:x1和x2同余c[i](i=1..n),但是x1%k!=x2%k 则此时不能确定x%k的值,答案为no即(x1-x2)%c[i]==0 因为lcm(c[1]..c[n])|(x1-x2) k不整除(x1-x2) k也不整除lcm(c[1]..c[n]) 该条件为必要条件.证明充分性很简单 构造x1=2*lcm,x2=lcm