首页 > 其他分享 >daimayuan252 | 摸鱼(状压, 枚举, 小技巧)

daimayuan252 | 摸鱼(状压, 枚举, 小技巧)

时间:2023-08-18 22:55:36浏览次数:38  
标签:int 状压 枚举 long ++ daimayuan252 check

题目很straightforward的, 看到n范围很小考虑状压, 暴力枚举所有的可能pattern.

第一种做法, 暴力枚举是\(O(2^n)\)的, 然后check函数判断是\(O(n^2)\)的, 一共是\(O(n^22^n)\)的, 可以通过.

第二种做法, 我们考虑把判断pattern是否合法的限制条件也压成二进制串, 那么我们比对条件就变成\(O(1)\), check函数判断变成
\(O(n)\), 总时间复杂度降为\(O(n2^n)\)

AC代码:

/*
Author: SJ
*/
#include<bits/stdc++.h>
const int N = 1e5 + 10;
using ll = long long;
using ull = unsigned long long;

using namespace std;

int n;

vector<int> a, b, s;

bool check(int x) {
  for (int i = 0; i < n; i++) {
    if (s[i] && (x & (1 << i)) && ((s[i] & x) == s[i])) {
      return false;
    }
  }
  return true;
}

ll query(int x) {
  ll res = 0;
  for (int i = 0; i < n; i++) {
    if (x & (1 << i)) {
      res += a[i];
    }
  }
  return res;
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  //freopen("data.in", "r", stdin);
  //freopen("data.ans", "w", stdout);

  cin >> n;

  a.assign(n, 0);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }

  b.assign(n, 0);
  s.assign(n, 0);
  for (int i = 0; i < n; i++) {
    cin >> b[i];
    for (int j = 0; j < b[i]; j++) {
      int x;
      cin >> x;
      x--;
      s[i] |= (1 << x);
    }
  }

  ll ans = -1;
  for (int i = 0; i < (1 << n); i++) {
    if (check(i)) {
      ans = max(ans, (ll)query(i));
    }
  }

  cout << ans;
  return 0;
}

标签:int,状压,枚举,long,++,daimayuan252,check
From: https://www.cnblogs.com/IhopeIdieyoung/p/17641774.html

相关文章

  • C#枚举转换
    [Fact]publicvoidTest(){int?i=2;vart=Enum.Parse(typeof(ReportTypeEnum),i.ToString());//AntiFraudvart2=(ReportTypeEnum)i;//AntiFraudvarresult=string.Empty;......
  • 通过枚举获取bean
    /***@Author:szc*@Description:从枚举中获得容器bean*@Date:2023/3/719:56*/publicenumGetBeanEnum2{SERVICE_A("serviceA","服务A"){//privateApplicationContextapplicationContext;@Overridepublicvoids......
  • 自定义MarkupExtension的学习,以及WPF中Combobox绑定枚举类型
    我们上一期讲到ComBobox绑定数据,https://www.cnblogs.com/guchen33/p/17630808.html这次我们简单化一下,正常来讲WPF中绑定不了枚举的像这样//前台代码<ComboBoxItemsSource="{BindingMyEnum}"/>//后台VMpublicenumMyEnum{One,Two,Three,Fo......
  • JAVA枚举类
    枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让用户随意创建。例如季节这个类只有春夏秋冬。不需要用一次创建一次。开发中,如果针对于某个类,其实例是确定个数的。则推荐将此类声明为枚举类。如果枚举类的实例只有一个,则可以看做是单例的实现方式。......
  • JavaSE--枚举enum
    一、枚举类型1、什么使用使用枚举  在开发中,有可能遇到一个方法的执行结果可能包括三种情况,四种情况,五种情况不等,  但是每一个都是可以数清楚的,一枚一枚都是可以列举出来的。2、枚举的定义enum枚举类型名{枚举值1,枚举值2,枚举值3......}3、  枚举是一种引用......
  • typeScript学习-TS类型-枚举
    typeScript学习枚举:enum枚举的定义:用来存放一组固定的常量的序列。枚举带来的好处:1、有默认值和可以自增值,节省编码时间2、语义更清晰,可读性增强,因为枚举是一种值类型的数据类型,方法参数可以明确参数类型为枚举类型enumWeekEnd{Monday="myMonday",//......
  • 统一响应类和响应枚举
    统一响应类importcom.fasterxml.jackson.annotation.JsonInclude;importcom.sangeng.enums.AppHttpCodeEnum;importjava.io.Serializable;@JsonInclude(JsonInclude.Include.NON_NULL)publicclassResponseResult<T>implementsSerializable{privateInteg......
  • c++枚举详细介绍以及具体用法
    C++中的枚举(Enumeration)是一种用于定义命名常量集合的数据类型。枚举可以提高代码的可读性和可维护性,让您可以使用有意义的名称来表示特定的取值,而不必使用原始的数字常量。枚举的基本语法:enumEnumName{Value1,Value2,//...};EnumName是枚举类型的名称......
  • 域内用户名枚举
    在无域内有效凭证的情况下,枚举出域内存在的用户名,在对其进行密码喷洒获得域内有效凭证利用原理:kerberos认证的as-req阶段,请求包cname对应的值是用户名。当用户状态分别为1.用户存在且启用KDC_ERR_PREAUTH_REQUIRED2.用户存在但禁用KDC_ERR_CLIENT_REVOKEDNTSTATUS:STATUS_AC......
  • 状压 dp 变式
    利用\(dp_i\)的取值一开始这就是状压dp模版但是有时间要求,而且又要满足连续时间超过\(L\),显然连续时间越大越好那么\(dp_i\)的取值就是最大连续时间转移时可以根据\(dp_i\)进行二分,总时间复杂度能够勉强通过点击查看代码#include<algorithm>#include<iostrea......