校赛热身 Problem C. Sometimes Naive (状压dp)
2024-08-29 08:41:12
- 题解:
- 列举每一种3的倍数的组合,开始先求出3条边的可行解,则
- 六条边的可行解可以由两个三条边得来。
- 详见代码解析
#include<bits/stdc++.h>
using namespace std;
int a[],n,cnt,ant,is[],dp[];
struct node
{
int num,id;
}angle[];
bool cmp(const node& a,const node& b)
{
return a.num<b.num;
}
int abs1(int x)
{
if(x<)return -x;
return x;
}
void init()
{
for(int i=;i<(<<n);i++)
{
int ans=,t=i;
while(t)
{
if(t&)ans++; //这一位是1节++
t=t>>; //右移
}
if(ans%==)
{
angle[cnt].id=i;
angle[cnt++].num=ans/;
}
if(ans==)
{
int v[],ans1=,ans2=,t=i;
while(t)
{ //把二进制位是1的边对应上
if(t&)v[ans1++]=a[ans2];
t=t>>;
ans2++;
}
if(abs1(v[]-v[])<v[]&&abs1(v[]-v[])<v[]&&abs1(v[]-v[])<v[])
{ //两边只差小于第三边,和会超int
is[ant++]=i;
dp[i]=;
}
}
}
}
int main()
{
int T,cas=;scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%d",&a[i]);
cnt=,ant=;
memset(dp,,sizeof(dp));
dp[]=;
init();
sort(angle,angle+cnt,cmp);//要排序
for(int i=;i<cnt;i++)
{
node e=angle[i];
for(int j=;j<ant;j++)
{
//&位运算
if(dp[e.id]&&!(e.id&is[j]))//若e.id已存在并且
//.e.id中的边与is[j]中没有重边则dp[e.id|is[j]]=1
dp[e.id|is[j]]=;//推到下一个
}
}
for(int i=cnt-;i>=;i--)
{
if(dp[angle[i].id]) //答案要最多,从后往前遍历
{
printf("Case #%d: %d\n",++cas,angle[i].num);
break;
}
}
}
return ;
}
最新文章
- Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx
- 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组
- 浅析JVM内存结构和6大区域(转)举例非常好
- oracle 10g 学习之客户端安装和配置(2)
- js截取指定字节长度的字符串
- 无法连接vCenter Server清单https://IP:10443
- [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)
- APUE读书笔记:进程控制
- 如何通过 HSB 颜色模式构建夜间模式
- Node.js之操作文件系统(一)
- C++计时器:毫秒级和微秒级
- 20160216.CCPP体系详解(0026天)
- js02-常用流程控制语句
- AlexNet总结
- Jenkins配置中安装插件时提示“No such plugin: cloudbees-folder”
- Eclipse launch configuration----Eclipse运行外部工具
- 编写高效的JavaScript程序
- 设置UCHome注册登陆退出的跳转页自定义
- CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
- 第8课 goto和void分析