CodeForces 534C - Polycarpus' Dice

来源:互联网 发布:淘宝网天猫购裱画材料 编辑:程序博客网 时间:2024/06/14 18:42


题意:给定n (1 <= n <= 2*10^5) 个骰子,给定每个骰子最大可以掷出的最大数(最小数始终为1),给定所有骰子掷出的点数和A,求每个骰子不可能掷出的点数个数。


考虑最大和最小情况,作差即可(详情见代码注释)


#include<cstdio>#include<cstring>#include<cctype>#include<cstdlib>#include<cmath>#include<iostream>#include<sstream>#include<iterator>#include<algorithm>#include<string>#include<vector>#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<list>typedef long long ll;typedef unsigned long long llu;const int MAXN = 100 + 10;const int MAXT = 200000 + 10;const int INF = 0x7f7f7f7f;const double pi = acos(-1.0);const double EPS = 1e-6;using namespace std;int n;ll a[MAXT], A;int main(){    scanf("%d%I64d", &n, &A);    ll allsum = 0;                      //所有骰子最大值加起来的总最大值    for(int i = 0; i < n; ++i){        scanf("%I64d", a + i);        allsum += a[i];    }    for(int i = 0; i < n; ++i){        ll down = max(1ll, A - (allsum - a[i]));    //骰子最小值 = 需要的和 - 其他骰子已经全部最大的值        ll up = min(a[i], A - (n - 1));             //骰子最大值 = 需要的和 - 其他骰子全部最小值        if(i)  printf(" ");        printf("%I64d", a[i] - (up - down + 1));    //不可能出现的数 = 总共可以表示的数 - 已经能表示的数    }    return 0;}


0 0