2013 :: 杭州

A

状压暴力

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int dx[2][4]={1,-1,-1,1,0,0,0,0};
const int dy[2][4]={0,0,0,0,1,1,-1,-1};
const int inf=0x3f3f3f3f;
int n,m,sz,res,H[205][205];
vector<pii> vec;
char s[205][205];
inline int light(int u,int st,int dir) {
    st|=(1<<u);
    int x=vec[u].first,y=vec[u].second;
    for (int i=0;i<2;++i) {
        int tx=x+dx[i][dir],ty=y+dy[i][dir];
        if (tx<0||tx>=n||ty<0||ty>=m)
            continue;
        if (s[tx][ty]==‘#‘)
            return -1;
        st|=(1<<H[tx][ty]);
    }
    return st;
}
void dfs(int u,int st,int now,int cnt) {
    if (st==sz) {
        res=min(res,cnt);
        return;
    }
    if (u==(int)vec.size())
        return;
    if (u==now) {
        for (int i=0;i<4;++i) {
            int nxt=light(u,st,i);
            if (nxt==-1)
                continue;
            dfs(u+1,nxt,now,cnt+1);
        }
    } else {
        int nxt=light(u,st,1);
        if (nxt!=-1)
            dfs(u+1,nxt,now,cnt+1);
    }
    dfs(u+1,st,now,cnt);
}
int main()
{
    while (scanf("%d%d",&n,&m)==2&&n+m) {
        memset(H,-1,sizeof H);
        for (int i=0;i<n;++i)
            scanf("%s",s[i]);
        vec.clear();
        int cnt=0;
        for (int i=0;i<n;++i)
            for (int j=0;j<m;++j)
                if (s[i][j]==‘.‘) {
                    vec.push_back(pii(i,j));
                    H[i][j]=cnt++;
                }
        if (cnt==0) {
            puts("0");
            continue;
        }
        sz=vec.size();
        sz=(1<<sz)-1;
        res=inf;
        for (int i=0;i<(int)vec.size();++i)
            dfs(0,0,i,0);
        printf("%d\n",res==inf?-1:res);
    }
    return 0;
}

B

爆搜图基本和A一样

#include <bits/stdc++.h>
using namespace std;
struct node {
    int x,y,st;
    node(){}
    node(int x,int y,int st):x(x),y(y),st(st){}
};
queue<node> que;
const int maxn=105;
const int inf=0x3f3f3f3f;
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
int n,m,t,st,X[5],Y[5],vis[105][105][16];
char s[105][105];
inline int bfs(int xx,int yy) {
    while (!que.empty())
        que.pop();
    for (int i=0;i<n;++i)
        for (int j=0;j<m;++j)
            for (int k=0;k<st;++k)
                vis[i][j][k]=inf;
    int temp=0;
    for (int i=0;i<t;++i)
        if (xx==X[i]&&yy==Y[i])
            temp|=(1<<i);
    vis[xx][yy][temp]=0;
    que.push(node(xx,yy,temp));
    while (!que.empty()) {
        int x=que.front().x,y=que.front().y,now=que.front().st;
        que.pop();
        for (int i=0;i<4;++i) {
            int tx=x+dx[i],ty=y+dy[i],nxt=now;
            if (tx<0||tx>=n||ty<0||ty>=m||s[tx][ty]==‘#‘)
                continue;
            for (int j=0;j<t;++j)
                if (tx==X[j]&&ty==Y[j])
                    nxt|=(1<<j);
            if (nxt==(st-1))
                return vis[x][y][now]+1;
            if (vis[tx][ty][nxt]!=inf)
                continue;
            vis[tx][ty][nxt]=vis[x][y][now]+1;
            que.push(node(tx,ty,nxt));
        }
    }
    return -1;
}
int main()
{
    while (scanf("%d%d",&n,&m)==2&&n+m!=0) {
        for (int i=0;i<n;++i)
            scanf("%s",s[i]);
        scanf("%d",&t);
        st=1<<t;
        for (int i=0;i<t;++i) {
            scanf("%d%d",&X[i],&Y[i]);
            --X[i],--Y[i];
        }
        for (int i=0;i<n;++i)
            for (int j=0;j<m;++j)
                if (s[i][j]==‘@‘)
                    printf("%d\n",bfs(i,j));
    }
    return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
int n,s1[305][305],s2[305][305],s3[305][305];
inline int compare() {
    int ret=0;
    for (int i=0;i<n;++i)
        for (int j=0;j<n;++j)
            if (s1[i][j]==s2[i][j])
                ++ret;
    return ret;
}
inline void flip() {
    for (int i=0;i<n;++i)
        for (int j=0;j<n;++j)
            s3[j][n-i-1]=s1[i][j];
    for (int i=0;i<n;++i)
        for (int j=0;j<n;++j)
            s1[i][j]=s3[i][j];
}
int main()
{
    while (scanf("%d",&n)==1&&n!=0) {
        for (int i=0;i<n;++i)
            for (int j=0;j<n;++j)
                scanf("%d",&s1[i][j]);
        for (int i=0;i<n;++i)
            for (int j=0;j<n;++j)
                scanf("%d",&s2[i][j]);
        int res=0;
        for (int i=0;i<4;++i) {
            res=max(res,compare());
            flip();
        }
        printf("%d\n",res);
    }
    return 0;
}

I

DP

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int g,b,s,bag[50][10],dp[2][1<<21];
int vec[10];
int dfs(int u,int st) {
    if (st==(1<<b)-1) {
        return 0;
    }
    int tmp[10];
    if (u==0&&dp[u][st]!=-inf)
        return dp[u][st];
    if (u==1&&dp[u][st]!=inf)
        return dp[u][st];
    int ret=(u==0)?-inf:inf;
    for (int i=0;i<b;++i)
        if (!(st&(1<<i))) {
            for (int j=0;j<g;++j)
                tmp[j] = vec[j];

            for (int j=0;j<g;++j)
                vec[j]+=bag[i][j];
            int flag=0;
            for (int j=0;j<g;++j)
                if (vec[j]>=s) {
                    flag+=vec[j]/s;
                    vec[j] %=s;
                }
            if (!flag) {
                if (u==0)
                    ret=max(ret,dfs(!u,st|(1<<i)));
                else
                    ret=min(ret,dfs(!u,st|(1<<i)));
            }
            else {
                if (u==0)
                    ret=max(ret,dfs(u,st|(1<<i))+flag);
                else
                    ret=min(ret,dfs(u,st|(1<<i))-flag);
            }

            for (int j=0;j<g;++j)
                vec[j] = tmp[j];
        }
    return dp[u][st]=ret;
}
int main()
{
    while (scanf("%d%d%d",&g,&b,&s)==3&&(g!=0||b!=0||s!=0)) {
        memset(bag,0,sizeof bag);
        memset(vec,0,sizeof(vec));
        for (int i=0;i<b;++i) {
            int n;
            scanf("%d",&n);
            for (int j=0;j<n;++j) {
                int c;
                scanf("%d",&c);
                --c;
                ++bag[i][c];
            }
        }
        for (int i=0;i<(1<<b);++i) {
            dp[0][i]=-inf;
            dp[1][i]=inf;
        }
        printf("%d\n",dfs(0,0));
    }
    return 0;
}

时间: 2024-10-09 10:12:43

2013 :: 杭州的相关文章

hdu 4779 Tower Defense 2013杭州现场赛

1 /** 2 题意: 有两种塔,重塔,轻塔.每种塔,能攻击他所在的一行和他所在的一列, 轻塔不 能被攻击,而重塔可以被至多一个塔攻击,也就是说重塔只能被重塔攻击.在一个n*m 的矩阵中,最少放一个塔,可放多个 3 问,给定p个重塔,q个轻塔,问有多少种放法.. 4 5 思路: 1. 一行中有两个重塔, 6 2. 一列中有两个重塔 7 3. 在该行及在该行塔所在的列只有一个塔,重塔或者轻塔. 8 对以上三种情况 9 挨个处理: 10 1. 设有i行有两个重塔,j列有两个重塔,则一共占 i+2*j

hdu 4738 2013杭州赛区网络赛 桥+重边+连通判断 ***

题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥,使得这n座岛不连通,求最少要派多少人去. 处理重边 边在遍历的时候,第一个返回的一定是之前去的边,所以这条边忽略,然后继续遍历,此时可以通过未遍历的边返回pre 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath

hdu 4741 2013杭州赛区网络赛 dfs ***

起点忘记录了,一直wa 代码写的很整齐,看着很爽 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 con

HDU 4777 Rabbit Kingdom

素因子分解,树状数组.$ACM/ICPC$ $2013$杭州区域赛$H$题. 首先需要处理出数字$a[i]$左边最远到$L[i]$,右边最远到$R[i]$区间内所有数字都与$a[i]$互质. 那么对于左端点在$[L[i],i]$并且右端点在$[i,R[i]]$的询问,$a[i]$就可以作出一个贡献. 接下来的问题就可以转化为二维平面上有很多矩形,每次询问一个点被多少矩形覆盖.可以离线操作,类似于扫描线的思想做就可以了. 素因子分解需要一开始把$20$万个数字都处理好,避免每组测试数据内重复处理.

ACM感悟(转载)

这是一篇转载的感悟,感觉写的非常好,有助于我们在ACM上少走弯路,所以就分享一下. 链接:http://www.cnblogs.com/Chierush/p/3760870.html 声明:本文是写给弱校ACM新手的一点总结,受自身水平和眼界所限,难免会有一些个人主观色彩,希望大牛指正 感谢@Wackysoft .@哇晴天 . @ 一切皆有可能1 的指教,现根据这些建议,文章已进行修改 先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生

ACM感悟

声明:本文是写给弱校ACM新手的一点总结,大牛请无视 先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华),省赛狗血一银(2013山东) 总共有过5位队友 个人感觉SDUST ACM集训队的最大缺点就是经验得不到继承,几乎每一届都是从零开始,我们11级更是这样 下面是我一年半以来根据平常对11级队员习性的了解和各个队员最后的兴衰得出的一些经验,当然

【转载】ACM总结

转自亲学长的总结 声明:本文是写给弱校ACM新手的一点总结,受自身水平和眼界所限,难免会有一些个人主观色彩,希望大牛指正 感谢@Wackysoft .@哇晴天 . @ 一切皆有可能1 的指教,现根据这些建议,文章已进行修改 先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华),省赛狗血一银(2013山东) 总共有过5位队友 个人感觉SDUST AC

近期小计划...

几场区域赛下来... 暴露了很多不足,来定个小计划... (1)DLX 安装包 (2)Lucas 补丁(2013 Dhaka E) (3)Dilworth 安装包(poj 1065.3636,博文1,博文2) (4)树--巨型安装包(分治,重心,倍增,treap) (5)圆的反演 启蒙包(2013 杭州 D,博文1)

【HDU 4771 Stealing Harry Potter&#39;s Precious】BFS+状压

2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点,搜索下一个最近的宝藏,直至找到全部k个宝藏.有点贪心的感觉. 由于求最短时间,BFS更快捷,但耗内存,这道题就卡在这里了... 这里记录了我几次剪枝的历史...题目要求内存上限32768KB,就差最后600KB了...但我从理论上觉得已经不能再剪了,留下的结点都是盲目式搜索必然要访问的结点. 在此贴