补题:牛客练习赛57 还差三题.jpg

为了督促自己补题!以后都开博客记录!

本次比赛:牛客练习赛57
比赛地址:点我
时间:2020/1/11

共做出两题,最后卡在搜索。

睡过头,晚了半小时才开始打

A:签到题,按照题意模拟即可。
B:直接模拟超时,判断的话情况又太多,可以把中间的过程都跳过,让他们两个都保持血量大于0,再模拟即可。
C:刚开始写了个O(3 n ^n n)的算法,分为选与不选,和放在下一个箱子。T了一发之后就开始摸鱼了。
优化:设现在已经使用了num个盒子,对于第step个物品,可以选择放在1-num个盒子中,若num < x也可以选择单独放在下一个盒子中。复杂度有点迷。

///                 .-~~~~~~~~~-._       _.-~~~~~~~~~-.
///             __.'              ~.   .~              `.__
///           .'//                  \./                  \\`.
///        .'//                     |                     \\`.
///       .'// .-~"""""""~~~~-._     |     _,-~~~~"""""""~-. \\`.
///     .'//.-"                 `-.  |  .-'                 "-.\\`.
///   .'//______.============-..   \ | /   ..-============.______\\`.
/// .'______________________________\|/______________________________`.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double pi = acos(-1);
namespace {
  template <typename T> inline void read(T &x) {
    x = 0; T f = 1;char s = getchar();
    for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
    for(;  isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
    x *= f;
  }
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
LL a[22], v[22];
LL n, x, w;
bool dfs(int step, int num) {
  if(num > x) return 0;
  if(step == n + 1) return 1;
  for(int i = 1; i <= num; i++) {
    if(a[step] + v[i] <= w) {
      v[i] += a[step];
      if(dfs(step + 1, num)) return 1;
      v[i] -= a[step];
    }
  }
  v[num+1] = a[step];
  if(dfs(step + 1, num + 1)) return 1;
  v[num+1] = 0;
  return 0;
}
int main() {
  int t;
  read(t);
  while(t--) {
    read(n), read(x), read(w);
    _rep(1, n, i)  read(a[i]), v[i] = 0;
    sort(a + 1, a + 1 + n);
    reverse(a + 1, a + 1 + n);
    if(a[1] > w) puts("No");
    else if(n <= x) puts("Yes");
    else {
      if(dfs(1, 1)) puts("Yes");
      else puts("No");
    }
  }
}

D:看了眼题目,题目描述很清晰。感觉马拉车能写,但是写不出来。题解用的是回文自动机,又能学一种自动机。学完来补。
开始时间:2020/1/11 9:38
E:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值