codeforces 534 C Polycarpus' Dice

http://codeforces.com/problemset/problem/534/C

题意是说一共有N个骰子,第I个筛子一共有di面...现在知道这些骰子的点数之和,问对于每一个骰子不能取得值有多少个。

乍一看有点不明觉厉...稍微再想下,求取值范围即可。

先把所有di相加,得到所有骰子点数之和的最大值...然后点数之和的最小值当然就是N

对于每个骰子,将最大值和最小值减去这个骰子的对应数值...然后与总和A进行比较。

注意要开long long !!!

比赛的时候我明明写了typedef。。。结果后面还是忘记了。。。真是悲伤。

 1
 2    /* ***********************************************
 3    Author :111qqz
 4    Created Time :2016年03月03日 星期四 13时54分19秒
 5    File Name :code/cf/problem/534C.cpp
 6    ************************************************ */
 7    
 8    #include <iostream>
 9    #include <algorithm>
10    #include <cstring>
11    #include <cmath>
12    #include <cstdio>
13    typedef long long LL;
14    const int N=2E5+7;
15    LL n,d[N],ans[N];
16    LL A,MAX,MIN,TMAX,TMIN;
17    
18    using namespace std;
19    
20    int main()
21    {
22        scanf("%I64d %I64d",&n,&A);
23        memset(ans,0,sizeof(ans));
24        for ( int i = 1; i <= n ;i ++ )
25            scanf("%I64d",&d[i]);
26        MAX = 0;
27        MIN = n;
28        for ( int i = 1; i <= n ; i++ )
29            MAX = MAX + d[i];
30        for ( int i = 1 ; i <= n ; i++ )
31        {
32            TMAX = MAX - d[i];
33            TMIN = MIN - 1;
34            if (d[i]>=(A-TMIN))
35            {
36                ans[i] =ans[i]+d[i]-(A-TMIN);
37            }
38            if (A>=TMAX+1)
39            {
40                ans[i] =ans[i]+A-TMAX-1;
41            }
42    
43        }
44        for ( int i = 1; i < n ; i++)
45            cout<<ans[i]<<" ";
46            cout<<ans[n];
47    
48    
49        return 0;
50    }
51