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 行。
每行应为 Draw
,F
,L
中的一种。
1
5 2
1 5 7 9 13
L
2
6 3
4 7 5 3 1 16
7 2
2 6 4 8 12 4 6
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 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 n≤5,T=1 |
4 4 4 | 25 25 25 | n ≤ 1000 n \leq 1000 n≤1000 |
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。
#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”<
}//平局
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;
}
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容