Codeforces Round 775

  1. 1. A. Game
  2. 2. B. Game of Ball Passing

A. Game

个横向排列的位置,序号为 ,每个位置可能有水,也可能是空的。

向相邻格子移动是不需要花费的。

在每组数据中,你只能跳一次。你可以跳任意格远。代价为 为终点 为起点)

你不能跳到含水格子里。保证起点 和终点 没有水。

只能跳一次,那么说明我们只可能通过一次大跳来跳过所有含水格子。大跳的代价与距离成正比,所以大跳的距离越小越好。

那么,大跳就从最左边的水格子前起跳,跳到最右边的水格子后即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<bits/stdc++.h>
using namespace std;

int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int k,ans=n+1,ans2=0;
for(int i=1;i<=n;i++)
{
cin>>k;
if(k==0) {ans=ans==n+1? i-1:ans;ans2=i+1;}
}
ans2=n-ans2;
if(ans==n+1) cout<<0<<endl;
else cout<<(n-ans-ans2)<<endl;
}
return 0;
}

B. Game of Ball Passing

传球游戏。在游戏的过程中,有 个人。他们将要互相传球。每个人传出球的次数是给定的(传入不算次数)。

那么,最少需要多少个球可以满足这些传球的次数呢?

比如说,第一组样例就可以只用一个球传出这种方案。

而第二组样例则不行。

重点在于如何利用 “每个人传出球的次数是给定的(传入不算次数)。”

找出踢球数最大的人,这个人的踢球数可以消耗其他人的踢球数。

若其他人的踢球数总和大于踢球数的人,这些人可以自己内部对踢(无论是一对一还是多对多,反正剩下的踢球数等于最大踢球数)。

但如果最大踢球数的人踢球的数量太大了,他跟其他人消耗后,还剩下了一些球数,只能他自己踢了(为什么?最多的情况下,即剩下人不内部踢球,只与最大踢球数的人踢,也只能消耗这些,还差一些)。

所以,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{
int t;
cin>>t;
while(t--)
{
int n,k,maxn=0,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>k;
maxn=max(maxn,k);
sum+=k;
}
// sum-=maxn;
// if(sum)
if(maxn==0) cout<<0<<endl;
else
{
int ans=max(1ll,maxn-(sum-maxn));
cout<<ans<<endl;
}
}
return 0;
}