今天又是训练赛的一天,今天的第一题点击打开链接,看懂题目后知道,这是一道最小生成树的变形,就是可能有两个点之间的距离可以视为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;
}
晚上回去再跟组里人好好讨论吧,加油,一定要弄个水落石出!