ACM集训日记-8月22日

来源:互联网 发布:中欧工程技术学院知乎 编辑:程序博客网 时间:2024/06/04 20:10

    今天又是训练赛的一天,今天的第一题点击打开链接,看懂题目后知道,这是一道最小生成树的变形,就是可能有两个点之间的距离可以视为0,然后使用prime算法就行了,比较坑的是一开始有部分的数不是double就WA,全部的数据类型改成double就AC了,今天的第二题点击打开链接,这道题就是一个有些贪心的味道,问最少用几块木板能铺完泥坑,需要注意的处理是,由于给的泥坑的位置不是升序的,需要输完泥坑的位置后sort排序一下,

for(i=1;i<=N;i++)//关键操作    {        if(w>=a[i].r) continue;        w=max(a[i].l,w);        while(w<a[i].r)        {            ans++;            w+=L;//加上一块木板的长度        }    }
   然后今天在训练赛期间没有A出的E题点击打开链接,这道题大致的意思就是求不大于k种病毒数的牛的最大值,我用的广搜,讲道理没什么问题,样例也是过了,但是就是WA,不知道哪里出错了

#include<iostream>#include<cstdio>#include<string.h>using namespace std;const int MAXN=1005;int n,d,k,ans=0,dif[16]={0},m=-1;struct cow{    int di;    int dise[16];}c[MAXN];int cd(){    int cnt=0;    for(int i=1;i<=15;i++)    {        if(dif[i]==1)cnt++;    }    return cnt;}void dfs(int x)//如果把第x头牛放进去{    if(ans>m)m=ans;    if(x>n)return;    else    {        for(int i=1;i<=d;i++)        {            if(c[x].dise[i]!=dif[i]&&!dif[i])            {                dif[i]=1;            }        }        if(cd()<=k)        {            ans++;            dfs(x+1);            ans--;        }        for(int i=1;i<=d;i++)        {            if(c[x].dise[i]==dif[i]&&dif[i])            {                dif[i]=0;            }        }        dfs(x+1);    }}int main(){    int f;    scanf("%d%d%d",&n,&d,&k);    for(int i=1;i<=n;i++)    {        cin>>c[i].di;        memset(c[i].dise,0,sizeof(c[i].dise));        for(int j=0;j<c[i].di;j++)        {            cin>>f;            c[i].dise[f]=1;        }    }    dfs(1);    cout<<m<<endl;    return 0;}
    晚上回去再跟组里人好好讨论吧,加油,一定要弄个水落石出!



原创粉丝点击