2018.10.10 练习赛 状态压缩专练

T1 防守马克

题解:

贪心,用(力量+重量)排序然后\(dfs\);

\(code\):

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
    int h,w,s;
}a[30];
int n,h;
bool c[30];
long long ans=-1;
bool cmp(const node &x,const node &y)
{
    return x.w+x.s>y.w+y.s;
}
void dfs(int x,int ch)
{
    c[x]=ch;
    if(x==n)
    {
        long long tmp=1e9,len=0;
        for(int i=1;i<=n;i++)
        if(c[i])
        {
            len+=a[i].h;
            long long sum=0;
            for(int j=i+1;j<=n;j++)
            sum+=c[j]?a[j].w:0;
            tmp=min(tmp,a[i].s-sum);
        }
    if(len>=h)ans=max(ans,tmp);return;}
    dfs(x+1,1);
    dfs(x+1,0);
}
int main()
{
    scanf("%d%d",&n,&h);
    for(int i=1;i<=n;i++)
    scanf("%d%d%d",&a[i].h,&a[i].w,&a[i].s);
    sort(a+1,a+n+1,cmp);
    dfs(0,0);

    if(ans==-1) printf("Mark is too tall\n");
    else printf("%lld",ans);
}

T2 王国危机

题解:

\(dfs\)二进制状压记录状态,标记状态

\(code:\)

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include<ctype.h>
#define bin(x) (1<<x)
#define inf 1e9+9
#define ll long long
using namespace std; 

char buf[1<<20],*p1,*p2;
inline char gc()
{
//    return getchar();
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin))==p1?0:*p1++;
} 

template<typename T>
inline void read(T &x)
{
    char tt;
    bool flag=0;
    while(!isdigit(tt=gc())&&tt!='-');
    tt=='-'?(flag=1,x=0):(x=tt-'0');
    while(isdigit(tt=gc())) x=x*10+tt-'0';
    if(flag) x=-x;
} 

int n,tot;
int a[25][25];
int w[25],ans;
bool book[1<<21];

void dfs(int s,int rest) {
    if(book[s]) return;
    book[s]=1;
    if (rest==1)
    {
        ans|=s;
        return;
    }
    for(int i=0;i<n;i++)
        if((bin(i)&s)&&w[i+1]>0) {
            for(int j=1;j<=n;j++)w[j]-=a[j][i+1];
            dfs(s^bin(i),rest-1);
            for(int j=1;j<=n;j++)w[j]+=a[j][i+1];
        }
}

int t;
int main()
{
//  freopen("1.txt","w",stdout);
    read(t);
    while(t--)
    {
        read(n);
        for(int i=1;i<=n;i++)
        {
            w[i]=0;
            for(int j=1;j<=n;j++)
            read(a[i][j]),w[i]+=a[i][j];
        }

        ans=0;
        tot=bin(n)-1;
        for(int i=0;i<=tot;i++) book[i]=0;
        dfs(tot,n);
        bool flag=0;
        for(int i=0;i<n;i++)
        if(bin(i)&ans)
        printf("%d ",i+1),flag=1;
        if (!flag) putchar('0');
        putchar(10);
    }
}

T3 奇怪的道路

题解:

同原先\(THH\)学长出的数数\(......\)

\(code:\)

#include<stdio.h>
#include<string.h>
#define ll long long
#define mod 1000000007

ll f[31][31][31][1<<9];
ll n,m,lim;

void inc(ll &a,ll b) {
    a+=b;
    a-=a<mod?0:mod;
}

ll dfs(ll u,ll l,ll v,ll s) {
    if(l==0) return s==0;
    if(u==1) return 0;
    if(f[u][l][v][s]!=-1) return f[u][l][v][s];
    ll ans=0;
    inc(ans,dfs(u,l-1,v,s^1^(1<<(u-v))));
    if(v>1&&u-v+1<=lim) inc(ans,dfs(u,l,v-1,s));
    else if(!(s&1)) inc(ans,dfs(u-1,l,u-2,s>>1));
    return f[u][l][v][s]=ans;
}

int main() {
    memset(f,-1,sizeof(f));
    scanf("%lld%lld%lld",&n,&m,&lim);
    printf("%lld",dfs(n,m,n-1,0));
}

原文地址:https://www.cnblogs.com/KatouKatou/p/9769967.html

时间: 2024-10-08 20:06:00

2018.10.10 练习赛 状态压缩专练的相关文章

2018.10.10 练习赛 状态压缩专练(T4-T5)

T4 Tourism 题解: \(F[p][s]\)表示讨论到p号点,根到p路径(不包含p)上的点的服务状态为s的最小费用. \(S\)是\(3\)进制数,\(0\)表示\(p\)自己服务自己,\(1\)表示\(p\)没有被服务到,\(2\)表示被其它点服务,这里的状态记录的是父亲 一直到根这条链上的,不超过\(10\)层,所以最多是\(3^{10}\) \(code\): //待补 T2 LED 题解: 待补 \(code:\) //待补 原文地址:https://www.cnblogs.co

2018.10.15 练习赛 搜索专练

T1 乘积分解 题解: 预处理出\(n\)的约数,用\(F[i][j]\)记录从排序后的第i个因数出发,连续\(j\)个因数的乘积. 要求\(fFi][j]<=n\),且\(j<=k\) \(code\): #include<cstdio> #include<algorithm> #include<iostream> #include<ctype.h> #include<ctime> #define ll long long usin

11.10晚间练习赛 一套全场爆零的好题

11.10晚间练习赛 一套全场爆零的好题 nodgd改的题面是真的令人不解 T1 数正方形 题面: 在\(N * N\)的点阵中任取4个点,回答: 问题1:这4个点恰好是"正放"的正方形的4个顶点的方案数是多少? 问题2:这4个点恰好是正方形(包括"正放"和"斜放")的4个顶点的方案数是多少? 下图为一个4*4的点阵,左图表示一种"正放"的方案,右图表示一种"斜放"的方案. ------ 看出来了就是水题

七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包

七周二次课(1月23日)10.6 监控io性能10.7 free命令10.8 ps命令10.9 查看网络状态10.10 linux下抓包 =====================================================================================================================================================================================

2018年10月小结(流水账) -- 1024程序员节快乐

2018年10月小结-- 1024程序员节快乐 今天刚好是1024程序员节.最近两个月没有更新博客,主要是最近有点迷茫,好像对技术丧失了热情,好像提不起兴趣.加上一些事情,感觉好累,好困,好迷茫.每当夜深人静的时候,有时会留下不知为什么的眼泪. 这两个月主要做基于公众号的WiFi故事机.原理很简单的,就是微信用户绑定一台故事机设备,然后公众号通过WebSocket发送命令到设备.实现微信互聊,故事点播,设备控制等简单功能.这个项目没什么技术含量的,至于卖的好不好暂时还不清楚. 就是这样一个一个小

10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包

- 10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包 - 扩展tcp三次握手四次挥手 http://www.doc88.com/p-9913773324388.html  - tshark几个用法:http://www.aminglinux.com/bbs/thread-995-1-1.html  # 10.6 监控io性能 ![mark](http://oqxf7c508.bkt.clouddn.com/b

IntelliJ IDEA 最新激活码(截止到2018年10月14日)

IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInBy

10.6 监控io性能;10.7 free;10.8 ps;10.9 查看网络状态;10.10 抓包

扩展: tcp三次握手四次挥手 http://www.doc88.com/p-9913773324388.html tshark几个用法: http://www.aminglinux.com/bbs/thread-995-1-1.html 10.6 监控io性能 安装iostat命令(也是安装这个包) : [[email protected] ~]# yum install -y sysstat 1. (监控)查看 磁盘io使用情况:iostat -x 重要关注:%util 值  表示io磁盘使

2018.3.10 bellman-ford algorithm, floyd-warshall algorithm and johnson&#39;s algorithm

这周还是继续dynamic programming,不过回到了图算法,因为之前讲图算法的时候还没有讲到动态规划,而这三个算法要么本身是动态规划算法,要么要用到动态规划算法. 1.bellman-ford是一种求无负权值的环路的有向图两点间最小路径的算法,也就是说和dijkstra解决的是同一个问题.但是dijkstra无法计算有负权值的边时的情况,bellman-ford可以处理这种情况.如果给定的图有负权值的环路的话,那么就会出现负无穷大的最小路径,那当然是处理不了的,不过如果只有正权值的环路