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