简单搜索题

3 篇文章 0 订阅

emmm为了让博客数不那么大。
hdu 2510
打表题。
table code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 30;

int n;
int tot=0;
int a[N][N];

bool check(){
    int cnt1=0,cnt2=0;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            cnt1+=(a[i][j]==1);
            cnt2+=(a[i][j]==0);
        }
    }
    return cnt1==cnt2;
}

void fill(){
    for(int d=n-1;d>=1;--d){
        for(int i=1;i<=d;++i){
            if(a[d+1][i]==a[d+1][i+1]) a[d][i]=1;
            else a[d][i]=0;
        }
    }
}

void dfs(int d){
    if(d==n+1){
        fill();
        if(check()) ++tot;
        return ;
    }
    a[n][d]=0;dfs(d+1);
    a[n][d]=1;dfs(d+1);
}

int main(){
    freopen("test.txt","w",stdout);
    for(int i=1;i<=24;++i){
        tot=0;n=i;
        memset(a,-1,sizeof(a));
        dfs(1);
        printf("%d,",tot);
    }
    return 0;
}

AC code:

#include<cstdio>

int a[25]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229};

int main(){
    while(1){
        int n;scanf("%d",&n);
        if(n==0) break;
        printf("%d %d\n",n,a[n]);
    }
    return 0;
}

hdu 1594

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 15;
const int inf = 0x7FFFFFFF;

int t;
int a[N],ans=inf;
bool vis[N];

void dfs(int d,int sum){
    if(sum>=ans) return ;
    if(d==10){
        ans=min(ans,sum);
        return ;
    }
    for(int i=1;i<=9;++i){
        if(!vis[i]){
            vis[i]=true;
            int j;
            for(j=i+1;j<=10;++j)
                if(!vis[j]) break;
            dfs(d+1,sum+abs(a[j]-a[i]));
            vis[i]=false;
        }
    }
}

void update(){
    memset(vis,0,sizeof(vis));
    ans=inf;
}

int main(){
    scanf("%d",&t);
    while(t--){
        int x;update();
        for(int i=1;i<=10;++i) scanf("%d",&x),a[x]=i;
        dfs(1,0);
        printf("%d\n",ans);
    }
    return 0;
}

有一道题狂T,但交网上ac代码无一通过。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}

const int N = 20000 + 10;

int n;
struct node{
    int pre,v;
}e[N];

int num=0,head[N];
void addedge(int from,int to){
    e[++num].pre=head[from],e[num].v=to;
    head[from]=num;
}

int a[N],dp[N],in[N];
int f[N];

void dfs(int u){
    if(a[u]==0){
        dp[u]=u;
        return ;
    }
    int cnt=0;
    for(int i=head[u];i;i=e[i].pre){
        int v=e[i].v;
        dfs(v);
        f[++cnt]=dp[v];
    }
    sort(f+1,f+cnt+1);
    if(a[u]!=0) dp[u]=f[(a[u]+1>>1)-1];
}

void update(){
    memset(head,0,sizeof(head));
    memset(in,0,sizeof(in));    
    num=0;
}

int main(){
    while(~scanf("%d",&n)){
        update();
        for(int i=1;i<=n;++i){
            a[i]=read();
            int u;
            for(int j=1;j<=a[i];++j) u=read(),++in[u],addedge(i,u);
        }
        for(int i=1;i<=n;++i){
            if(in[i]==0){
                dfs(i);
                printf("%d\n",dp[i]);
                break;
            }
        }
    }
    return 0;
}

BZOJ 1306 记得剪枝。

#include<bits/stdc++.h>
using namespace std;

const int N = 10;

int n;
int a[N],c[N],tot=0;
int sx[3]={0,3,1},sy[3]={3,0,1};

void dfs(int d,int i){
//  printf("%d %d %d\n",d,c[d],i);
//  getchar();
    if(c[d]>a[d]) return ;
    if(c[d]+(n-i+1)*3<a[d]) return ;
    if(d==n) {++tot;return ; }
    if(i==n) {
        bool flag=true;
        int j;
        for(j=0;j<=2;++j){
            if(c[d]+sx[j]==a[d]&&c[n]+sy[j]<=a[n]){flag=false;break;}
        }
        if(flag==true) return ;
        c[d]+=sx[j],c[i]+=sy[j];
        dfs(d+1,d+2);
        c[d]-=sx[j],c[i]-=sy[j];        
    }
    else{
        for(int j=0;j<=2;++j){
            if(c[d]+sx[j]<=a[d]&&c[i]+sy[j]<=a[i]){
                c[d]+=sx[j],c[i]+=sy[j];
                dfs(d,i+1);
                c[d]-=sx[j],c[i]-=sy[j];
            }
        }
    }
    return ;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&a[i]);
    dfs(1,2);
    printf("%d\n",tot);
    return 0;
}

BZOJ 1024
定义状态x,y,d表示长为x,宽为y,剩下的切的次数为d的答案。
每次最少都要切x/d或y/d(定义这个是一个单位),然后每次枚举切的单位数。
【这道啥鼻涕我刚开始居然毫无想法。。。果然还是太弱了。

#include<bits/stdc++.h>
using namespace std;

double x,y,ans;
int n;

double dfs(double xx,double yy,int d){
    if(d==1) return max(1.0*xx/yy,1.0*yy/xx);
    double mx=xx/d,my=yy/d;
    double ans=233333333.0;
    for(double i=1.0;i<=d/2;i+=1.0){
        ans=min(ans,max(dfs(xx-mx*i,yy,d-i),dfs(mx*i,yy,i)));
        ans=min(ans,max(dfs(xx,yy-my*i,d-i),dfs(xx,my*i,i)));
    }
    return ans;
}

int main(){
    scanf("%lf%lf%d",&x,&y,&n);
    printf("%.6lf\n",dfs(x,y,n));
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值