首页 > 其他分享 >20220920祭

20220920祭

时间:2022-09-20 19:44:21浏览次数:78  
标签:20220920 return int void dfs getchar out

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;
}

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;
}

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

 

标签:20220920,return,int,void,dfs,getchar,out
From: https://www.cnblogs.com/thanktothelights/p/16712242.html

相关文章

  • 20220920
    Get和Post的区别post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)post发送的数据更大(get有url长度限制)post能发送更多的数据类型(get......
  • 20220920测试总结
    题目还是挺爽的。P2327[SCOI2005]扫雷原题链接题目分析我们设\(a[i]\)为第\(i\)行的数字,显然如果满足\(a[1]=3\veea[n]=3\)时,方案数为\(0\)呐等于\(0\)。所以接下来......