牛客练习赛3 B - 贝伦卡斯泰露

链接:https://www.nowcoder.net/acm/contest/13/B
来源:牛客网

题目描述

贝伦卡斯泰露,某种程度上也可以称为古手梨花,能够创造几率近乎
为0的奇迹,通过无限轮回成功打破了世界线收束理论。
和某民科学者不同,贝伦并不在意世界线收束的那套理论,作为奇迹
之魔女,贝伦的爱好只在于品茶。
作为品茶的消遣,贝伦正在解一道简单的谜题。
给出一个长度为n的数列A𝑖,问是否能将这个数列分解为两个长度
为n/2的子序列,满足
∙ 两个子序列不互相重叠。
∙ 两个子序列中的数要完全一样,{1, 2} = {1, 2},{1, 2} ≠ {2, 1}。

输入描述:

第一行,一个正整数T,表示数据组数。
接下来T组数据,每组数据的第一行,一个正整数n,第二行𝑛个正整数A𝑖

输出描述:

每组数据输出一行,如果可以完成,输出Frederica Bernkastel,否则输出Furude Rika。
示例1

输入

3
4
1 1 2 2
6
1 2 3 4 5 6
4
1 2 2 1

输出

Frederica Bernkastel
Furude Rika
Furude Rika

备注:

对于30%的数据,𝑛 ≤ 16。
对于另20%的数据,𝑇 = 1。
对于另20%的数据,𝑇 = 2。
对于100%的数据,𝑇 ≤ 5,1 ≤ 𝐴i <= n <= 40, 保证n为偶数。

题解

爆搜。

这题数据有点水,一开始用了一种$O(n^2)$的贪心水过去了。

自己造了很多数据发现跑不过去。下面这些数据都是可以分割出来的。

 100
38 29 29 35 39 35 37 24 34 39 37 24 34 3 3 6 6 25 2 17 32 25 11 25 2 2 32 17 32 25 16 11 2 25 9 32 16 25 9 26 10 25 10 2 25 2 35 6 6 35 6 6 32 32 11 32 32 11 26 26 30 30 18 18 18 18 40 1 24 1 24 8 8 39 6 39 34 28 6 34 5 31 7 28 37 20 28 5 7 31 7 28 37 23 1 16 20 7 13 23 14 1 16 40 13 14 40 40 30 30 6 5 6 21 5 21 39 39 39 35 2 9 39 32 35 2 18 2 3 9 32 2 4 18 3 14 22 9 14 4 14 22 9 35 34 14 35 34 38 3 4 3 5 4 6 5 6 2 6 6 2 1 5 4 6 1 4 5 4 6 4 5 4 5 4 3 3 4 3 4 3 1 3 1 3 2 2 20 3 2 2 3 2 3 2 3 6 3 3 3 4 2 6 5 3 4 2 5 16 2 17 27 37 25 38 2 17 27 25 27 37 25 38 27 25 10 37 26 26 37 26 26 36 26 26 36 12 5 5 36 33 33 5 5 36 33 33 9 9 10 19 18 29 19 29 19 18 29 19 29 12 10 19 40 10 40 19 40 40 5 40 40 5 10 20 20 1 20 20 7 7 1 7 7 10 10 10 21 2 2 10 10 21 2 2 10 15 15 24 16 16 15 15 24 16 16 10 32 2 32 20 32 32 2 32 20 32
#include <bits/stdc++.h>
using namespace std;

const int maxn = 110;
int T, n;
int a[maxn], f[maxn];
int ans;

void dfs(int x, int y, int num) {
  if(num == n) {
    ans = 1;
    return;
  }
  int tx = -1;
  for(int i = x + 1; i <= n; i ++) {
    if(f[i]) continue;
    tx = i;
    break;
  }
  if(tx == -1) return;
  int ty = -1;
  for(int i = y + 1; i <= n; i ++) {
    if(f[i]) continue;
    if(a[tx] != a[i]) continue;
    if(tx == i) continue;
    ty = i;
    f[tx] = 1;
    f[ty] = 1;
    dfs(tx, ty, num + 2);
    if(ans == 1) return;
    f[tx] = 0;
    f[ty] = 0;
  }
}

int main() {
  scanf("%d", &T);
  while(T --) {
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++) {
      scanf("%d", &a[i]);
      f[i] = 0;
    }
    ans = 0;
    for(int i = 2; i <= n; i ++) {
      for(int j = 1; j <= n; j ++) {
        f[j] = 0;
      }
      if(a[1] == a[i]) {
        f[1] = f[i] = 1;
        dfs(1, i, 2);
        if(ans) break;
      }
    }
    if(ans) printf("Frederica Bernkastel\n");
    else printf("Furude Rika\n");
  }
  return 0;
}

 

posted @ 2018-02-04 12:19  Fighting_Heart  阅读(519)  评论(0编辑  收藏  举报