打卡信奥刷题(865)用C++信奥P11077[普及组/提高] 「FSLOI Round I」石子

P11077 「FSLOI Round I」石子

题目背景

English statement. You must submit your code at the Chinese version of the statement.

小 F 和小 L 正在玩一种古老的博弈游戏的改版。

题目描述

给定 n n n 堆石子,第 i i i 堆有 a i a_i ai 个石子。设序列 a 1 , a 2 , ⋯   , a n a_1,a_2,\cdots,a_n a1,a2,,an 的平均数为 x x x。此外,还会给定一个不大于 x x x 的数字 k k k。小 F 和小 L 将轮流进行以下操作直至一方胜出,小 F 先手:

  • 选定两堆石子 i , j i,j i,j,满足 a i < x < a j a_i < x < a_j ai<x<aj。若无法选出这样的两堆石子,则对方获胜。

  • 从第 j j j 堆石子中拿出 k k k 个石子放到第 i i i 堆中。

小 F 和小 L 都将用最优策略进行操作。

若游戏会无限进行下去,输出 Draw。若小 F 将获胜,输出 F。否则,输出 L

小 F 一共会进行 T T T 场游戏,你需要告诉他每场游戏的结果。

输入格式

第一行一个整数 T T T,表示共有 T T T 组数据。

每组数据共两行。

第一行输入两个整数 n , k n,k n,k

第二行输入 n n n 个整数 a i a_i ai

输出格式

T T T 行。

每行应为 DrawFL 中的一种。

输入输出样例 #1

输入 #1

1
5 2
1 5 7 9 13

输出 #1

L

输入输出样例 #2

输入 #2

2
6 3
4 7 5 3 1 16
7 2
2 6 4 8 12 4 6

输出 #2

Draw
L

说明/提示

【样例 1 解释】

平均数为 7 7 7

小 F 可以选择 i = 1 , j = 5 i=1,j=5 i=1,j=5 进行操作,使得石子数分别为 3 , 5 , 7 , 9 , 11 3,5,7,9,11 3,5,7,9,11

小 L 可以选择 i = 1 , j = 4 i=1,j=4 i=1,j=4 进行操作,使得石子数分别为 5 , 5 , 7 , 7 , 11 5,5,7,7,11 5,5,7,7,11

小 F 可以选择 i = 2 , j = 5 i=2,j=5 i=2,j=5 进行操作,使得石子数分别为 5 , 7 , 7 , 7 , 9 5,7,7,7,9 5,7,7,7,9

小 L 可以选择 i = 1 , j = 5 i=1,j=5 i=1,j=5 进行操作,使得石子数分别为 7 , 7 , 7 , 7 , 7 7,7,7,7,7 7,7,7,7,7

小 F 无法进行操作。小 L 获胜。可以证明无论小 F 如何操作,小 L 都有必胜策略。

【数据规模与约定】

本题采用捆绑测试。

x x x 为序列 a a a 的平均值。

对于 100 % 100 \% 100% 的数据,保证:

  • 1 ≤ T ≤ 10 1 \leq T \leq 10 1T10
  • 1 ≤ n ≤ 2 × 1 0 5 1 \leq n \leq 2\times10^5 1n2×105
  • 0 ≤ a i ≤ 1 0 9 0 \leq a_i \leq 10^9 0ai109
  • 1 ≤ k ≤ x 1 \leq k \leq x 1kx
  • x x x 为整数
子任务 分值 特殊性质
1 1 1 5 5 5 A A A
2 2 2 10 10 10 k = 1 k = 1 k=1
3 3 3 15 15 15 n ≤ 5 , T = 1 n \leq 5, T =1 n5,T=1
4 4 4 25 25 25 n ≤ 1000 n \leq 1000 n1000
5 5 5 45 45 45

特殊性质 A A A a 1 = a 2 = a 3 = ⋯ = a n a_1=a_2=a_3=\cdots=a_n a1=a2=a3==an

C++实现

#include
using namespace std;
#define int long long
int t,n,k,ave,a[200010];
signed main(){
cin>>t;
while(t–){
int sum=0;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
ave=sum/n;//平均值
int flg=0;
for(int i=1;i<=n;i++) if(abs(a[i]-ave)%k!=0) flg=1;
if(flg){
cout<<“Draw”< continue;
}//平局
int num=0;
for(int i=1;i<=n;i++) num+=abs(a[i]-ave)/k;
num/=2;
cout<<(num%2?“F”:“L”)< }
return 0;
}

打卡信奥刷题(865)用C++信奥P11077[普及组/提高] 「FSLOI Round I」石子_第1张图片

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

你可能感兴趣的:(C++,c++,开发语言,算法,青少年编程,数据结构)