20220920祭

20220920

t1 [SCOI2005]扫雷]

传送门

最初思路

显然,对于数值为3或0的格子只有一种情况。考虑从已经确定的摆放情况向周围拓展,直至无法拓展。此时就将所有可以确定的摆放确定,最后只需处理不确定位置的方案数。一开始,我打算在不确定的位置进行dp,由上一个不确定的位置转移到下一个。最后思考无果,取得了蛙声一片的好成绩。虽然我个人觉得这个思路是可行的,但兴许只能以后实力有所长进了后才能来了结它了。。。

搜索

结果这题直接搜都能过

枚举每个位置放或不放,再通过格子中的数值判断能否即可。

附上die码
#include<iostream>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;++i) 
using namespace std;
template<typename T>inline void in(T &x){
    x=0;int f=0;char c=getchar();
    for(;!isdigit(c);c=getchar())f|=(c=='-');
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    x=f?-x:x;
}
template<typename T>inline void out(T x){
    if(x<0)x=~x+1,putchar('-');
    if(x>9)out(x/10);
    putchar(x%10^48);
}
const int N=100005;
int n;
int a[N],b[N];
int ans;
inline bool pd(int x){
    if(b[x-1]+b[x]+b[x+1]==a[x])return 1;
    return 0;
}
inline void dfs(int x){
    if(x>n){
        if(pd(n))
        ++ans;
        return;
    }
    b[x]=1;
    if(x==1||pd(x-1))dfs(x+1);
    b[x]=0;
    if(x==1||pd(x-1))dfs(x+1);
}

int main(){
    in(n);
    fo(i,1,n)in(a[i]);
    dfs(1);
    out(ans);
    return 0;
}

dp

t2 [SCOI2005] 互不侵犯

传送门

t3 [SCOI2005]繁忙的都市

传送门

一眼顶针,鉴定为最小生成树

题目分析

  1. 改造的那些道路能够把所有的交叉路口直接或间接的连通起来。
  2. 在满足要求 1 的情况下,改造的道路尽量少。
  3. 在满足要求 1、2 的情况下,改造的那些道路中分值最大的道路分值尽量小。

由1可得需要得到一个连通图,由2可得需要得到一棵树,由3可得需要边权值尽可能小。

综上可得求最小生成树即可。

代码如下(kruskal)
#include<iostream>
#include<algorithm>
#define ll long long
#define fo(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
template<typename T>inline void in(T &x){
    x=0;int f=0;char c=getchar();
    for(;!isdigit(c);c=getchar())f|=(c=='-');
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    x=f?-x:x;
}
template<typename T>inline void out(T x){
    if(x<0)x=~x+1,putchar('-');
    if(x>9)out(x/10);
    putchar(x%10^48);
}
const int N=305,M=1000005;
int n,m;
struct edge{
    int w,v,u;
}e[M];
bool operator<(edge a,edge b){
        return a.w<b.w; 
}
int fa[N];
inline int get(int x){
    return x==fa[x]?x:fa[x]=get(fa[x]);
}
int ans;
int main(){
    in(n),in(m);
    fo(i,1,m){
        int u,v,c;
        in(u),in(v),in(c);
        e[i].u=u,e[i].v=v,e[i].w=c;
    }
    sort(e+1,e+m+1);
    fo(i,1,n)fa[i]=i;
    for(int i=1;i<=m;++i){
        int u=get(e[i].u);
        int v=get(e[i].v);
        if(u==v)continue;
        fa[u]=v;
        ans=e[i].w;
    }
    out(n-1),putchar(' '),out(ans);
    return 0;
}

t4 [SCOI2005]最大子矩阵

传送门

还有两道,等把状压dp搞懂再说。。。

小桀

人菜,码力不足,状态撇,干啥啥不行,抱零第一名。

刷!都给我刷!只要刷不死就往死里刷!

posted @ 2022-09-20 19:34  リン・グァン  阅读(21)  评论(2编辑  收藏  举报