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
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;
    while(!isdigit(tt=gc()));x=tt-'0';
    while(isdigit(tt=gc())) x=x*10+tt-'0';
}

ll t,n,m,tot;
ll s[100005],fac[100005][30];
double start;
bool dfs(ll x,ll rest,ll fact)
{
    if(!rest) return fact==n;rest--;
    while(x)
    {
        if(x+rest>tot) return 0;
        if(fac[x][rest]>n||fac[x][rest]*fact>n) return 0;
        if(dfs(x+1,rest,fact*s[x])) return 1;x++;
    }
}

int main()
{
    read(t);
    while(t--)
    {
        bool flag=0;
        ll fact=1;
        read(n),read(m);
        if(n==1&&m==2){puts("NIE");continue;}
        if(m<=2)
        {
            puts("TAK");
            continue;
        }
        for(int i=1;i<=m;i++,fact*=i)
        if(fact>n)
        {
            flag=1;
            break;
        }
        if(flag) {puts("NIE");continue;}
        int i;tot=0;
        for (i=1;i*i<n;i++)
        if(n%i==0) s[++tot]=i,s[++tot]=n/i;
        if(i*i==n)s[++tot]=i;
        sort(s+1,s+tot+1);fact=1;
        for(int i=1;i<=tot;i++,fact=1)
        for(int j=0;j<m&&i+j<=tot;j++)
        {
            if(fact<=n) fact*=s[i+j];
            fac[i][j]=fact;
        }
//      for(int i=1;i<=10;i++)
//      printf("%d ",f[3][i]);
        if(dfs(1,m,1)) printf("TAK\n");
        else printf("NIE\n");
    }
}
//1 1000000000 6

T2 扫雷游戏

题解:

预处理\(i\),\(j\)两点穿过的直线,爆搜即可

\(code:\)

#include<stdio.h>
#include<cstring>
#include<algorithm>
#define lowbit(x) x&-x
using namespace std;

struct node{
    int x,y;
    inline node(int a=0,int b=0)
    {x=a,y=b;}
}a[20];

int n,k;
int f[1<<17],line[20][20];

int dfs(int s)
{
    if(~f[s]) return f[s];
    int cnt=0,t=s;
    while(t) cnt++,t^=lowbit(t);
    if(n-k>=cnt) return f[s]=0;
    if(cnt==1) return f[s]=1;
    f[s]=1e9+9;
    for(int i=0;i<n;i++) if(s>>i&1)
    for(int j=i+1;j<n;j++) if(s>>j&1)
    f[s]=min(f[s],dfs(s&(~line[i][j]))+1);
    return f[s];
}

int main()
{
    for(int t=1;t<=2;t++)
    {
        memset(f,-1,sizeof(f));
        memset(line,0,sizeof(line));
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            a[i]=node(x,y);
        }
        //(ay-ky)(ax-bx)==(ax-kx)(ay-by)
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++) if(i!=j)
        for(int k=0;k<n;k++)
        if((a[i].y-a[k].y)*(a[i].x-a[j].x)==(a[i].x-a[k].x)*(a[i].y-a[j].y))
        line[i][j]|=(1<<k);
     printf("%d\n",dfs((1<<n)-1));
    }
}

T3 数字消除游戏

题解:

A*+迭代加深+扩展周围有的颜色+不真实赋值,标记联通性

\(code:\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stdlib.h>
#include<ctype.h>
#define eps 1e-7
#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;
    while(!isdigit(tt=gc()));x=tt-'0';
    while(isdigit(tt=gc())) x=x*10+tt-'0';
}

int n;
int a[10][10],book[10][10];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool cl[10];
int gujia()
{
    int col=0;
    for(int i=0;i<=5;i++) cl[i]=0;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    if(!cl[a[i][j]]&&book[i][j]!=1)
    {
        cl[a[i][j]]=1;
        col++;
    }
    return col;
}

void dfs(int x,int y,int c)
{
    book[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int tx=x+dx[i],ty=y+dy[i];
        if(tx<=0||ty<=0||tx>n||ty>n) continue;
        if(book[tx][ty]==1) continue;

        book[tx][ty]=2;
        if(a[tx][ty]==c) dfs(tx,ty,c);
    }
}

int fill(int c)
{
    int sum=0;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    if(a[i][j]==c&&book[i][j]==2)
    {
        sum++;
        dfs(i,j,c);
    }
    return sum;
}

bool astar(int dep,int maxdep)
{
    int g=gujia();
    if(dep+g>maxdep) return 0;
    if(!g) return 1;
    int temp[10][10];
    for(int i=0;i<=5;i++)
    {
        for(int c=1;c<=n;c++)
        for(int j=1;j<=n;j++)
        temp[c][j]=book[c][j];

        if(fill(i)&&astar(dep+1,maxdep)) return 1;

        for(int c=1;c<=n;c++)
        for(int j=1;j<=n;j++)
        book[c][j]=temp[c][j];
    }
    return 0;
}

int main()
{
    while(1)
    {
        read(n);
        if(!n) return 0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        read(a[i][j]);

        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        book[i][j]=0;

        dfs(1,1,a[1][1]);
        for(int dep=0;;dep++)
        if(astar(0,dep))
        {
            printf("%d\n",dep);
            break;
        }
    }
}

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

时间: 2024-09-29 04:05:39

2018.10.15 练习赛 搜索专练的相关文章

2018.10.18 练习赛 数学专练

T1 打气球 题解: 期望递推,不关心具体位置,所以\(F[i][j]\)表示还有\(i\),\(j\)行,列未完; \(code\): #include<cstdio> #include<algorithm> #include<ctype.h> #include<vector> #include<queue> #include<cstring> #define lowbit(x) (x&-x) #define ll long

【谜客帝国】第139届微雨潇潇联想专场(2018.10.15)

[谜客帝国]第139届微雨潇潇联想专场(2018.10.15) 主持:瓷   计分:小白 1.本季重逢在帝国  只身东海挟春雷 乐天曲江之感怀 一段新愁染眉弯 5 今秋复来此 2.寒蛩轻唱送微凉  萧萧梧叶诉离情 白帝有语怜高洁 夜夜龙泉壁上鸣 4 此秋声也 3.人至中年心淡然  我言此季胜春潮 春愁夏恨冬烦忧 吟风作赋只伤春 4 不是悲秋 4.菊残犹有傲霜枝  立冬尚见黄叶飞 子夜歌里玉关情 竞雄洒血化碧涛 5 秋风吹不尽 5.轻寒最是可人天  貂裘换酒也堪豪 姑苏城外寒山寺 斋中结社咏海棠 

2018.10.02 练习赛

[T1 蒜头君当大厨] 题解: 显然差分约束,怕你看不出样例还疯狂暗示你= = \(code\): #include<stdio.h> #include<algorithm> #include<vector> #include<queue> #include<ctype.h> #define ll long long using namespace std; char buf[1<<20],*p1,*p2; inline char g

2018.10.15队测T2

题意 给出n个与坐标轴平行的线段,保证没有两条共线的线段具有公共点,没有重合的线段 找出最大的十字形并输出大小R,大小为R的十字形指的是以一个中心点向四周延伸出R单位长度形成的图形 1≤n≤100000,所有坐标的范围在-10^9~10^9中 暴力 把线段按长度排序,O(n^2)枚举+O2 原文地址:https://www.cnblogs.com/tangjingrong/p/9798668.html

2018.10.15队测

T1:算是sb题吧,我几乎完全不记得折半搜索了,虽然考试中想到过类似的做法,但是时间过不去就没想了.测试后惊讶发现我居然写过这道题,一模一样,但是一点印象都没有.也是个教训,以后学过的东西还是得复习.折半搜索这思路还是蛮简单的. 链接:subsets T2:这题是真的sao,我tm被这题坑死了,看他的描述就想到一个逆序对的结论,然后疯狂的去判无解的情况,然后写了个没有道理的贪心水分,事实证明一点道理都没有,还让我没时间写T3的暴力. 链接:swap T3:这题好像暂时是出锅了,留个坑待填. 原文

2018.10.15队测T3

题意 在一个网格图上,每次删掉一条边(u,v),再询问能否从u到v,如果能,就输出"HAHA",并删掉给出的该情况对应的边,否则就输出"DAJIA",并删掉另一条边 网格图大小<=500 1.删掉一条边,就相当于把边两侧的块联通了 于是就想到了并查集 2.两个顶点删边后不连通的情况: 即块A和块B在删边前已经在同一联通块中 另一种情况: 即在边界处的边被删了,这时可以看成块A块B与编号为0的块联通了 正解: 用并查集维护每个块的联通性,如果两个块在删边前就已处

【谜客帝国】第140届兰萱联想专场(2018.10.30)

 [谜客帝国]第140届兰萱联想专场(2018.10.30) 主持:瓷   计分:默沫 1.沧海桑田.抱布贸丝.金兵撼山.吹灰之力(一字)易 2.云长拒豪宅.逃出囹圄来.红杏春意闹.破门阖又开(三字)关不住 3.浅尝辄止.滑稽出演.少年之行.不大喝茶(二字)小品 4.余高阳之苗裔兮.滕王阁主今何在.董卓废之立新君.古诗有云君不见(二字)少帝 5.匈奴鲜卑并川渝.顽皮妖宝憨态掬.因何前倨后恭也.似闻主动点炮语(二字)胡巴 6.正是阿堵物.三强皆出色.一掷千金者.实乃囊羞涩(三字)不差钱 7.上书帝

macOS 10.15 Catalina Apache设置:多个PHP版本

第1部分:macOS 10.15 Catalina Web开发环境 在macOS上开发Web应用程序真是令人高兴.有许多设置开发环境的选项,包括广受欢迎的MAMP Pro,它在Apache,PHP和MySQL之上提供了一个不错的UI .但是,有时MAMP Pro的速度变慢或版本过旧,或者由于配置模板和非标准构建的限制性系统而表现不佳. 在这样的时代,人们经常寻找一种替代方法,幸运的是有一种替代方法,并且设置起来相对简单. 在此博客文章中,我们将引导您完成设置和配置Apache 2.4和多个PHP

CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root

catalog 0. 引言 1. Description 2. Effected Scope 3. Exploit Analysis 4. Principle Of Vulnerability 5. Patch Fix 0. 引言 新技术.高性能技术的不断发展,越来越提升了操作系统的能力,而近几年出现的虚拟化技术,包括overlayfs虚拟层叠文件系统技术,则为docker这样的虚拟化方案提供了越来越强大的技术支撑,但是也同时带来了很多的安全问题抛开传统的overflow溢出型漏洞不说,还有另一