途家 秋招 开发工程师 笔试 编程题 AC代码
两道数据都水,纯水过去的
因为数据太水了所以代码根本没有参考性!我的写法是有问题的!只是提供一个思路可以大家讨论一下
第一题:
纯贪心,t-i>4这个地方,写5是67%,写6及以上和3及以下是33%,写4就A了,无赖骗分
#include<cstdio>
using namespace std;
int main()
{
int m,s,t;
int dis,time;
scanf("%d%d%d",&m,&s,&t);
dis=0;
for (int i=1;i<=t;i++)
{
if (m>=10)
{
dis+=50;
m-=10;
}
else if (t-i>4)
{
m+=4;
}
else
{
dis+=13;
}
if (dis>=s)
{
printf("YES\n");
printf("%d\n",i);
break;
}
}
if (dis<s)
{
printf("NO\n");
printf("%d\n",dis);
}
return 0;
}
第二题: 正解不会,试着只对这R个特定点建图,求一波最小生成树,A了
最小生成树明显是错的,问了巨佬说这个题有问题,除了旅行商都有反例,可能是个错题
有空可以写下旅行商解法
#include<cstdio>
#include<algorithm>
using namespace std;
int f[10100];
struct numm
{
int x,y;
int v;
}qwq[10100];
bool cmp(numm a,numm b)
{
return (a.v<b.v);
}
int find(int x)
{
while (x!=f[x]) x=f[x];
return x;
}
int main()
{
int fx,fy,qxq;
int dis,ans;
int R[110];
int len;
int a,b,c;
int n,m,r;
scanf("%d%d%d",&n,&m,&r);
for (int i=1;i<=r;i++) scanf("%d",&R[i]);
sort(R+1, R+1+r);
len=0;
for (int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
bool isx,isy;
isx=isy=false;
for (int k=1;k<=r;k++)
{
if (R[k]==a) isx=true;
if (R[k]==b) isy=true;
if (isx==true && isy==true) break;
}
if (isx==false || isy==false) continue;
//printf("addpair: %d %d ==%d\n",a,b,c);
len++;
qwq[len].x=a;
qwq[len].y=b;
qwq[len].v=c;
}
qxq=0;
ans=0;
for (int i=1;i<=n;i++) f[i]=i;
sort(qwq+1,qwq+1+len,cmp);
for (int i=1;i<=len;i++)
{
fx=find(qwq[i].x);
fy=find(qwq[i].y);
if (fx!=fy)
{
f[fx]=fy;
qxq++;
//printf("addline= %d\n",qwq[i]);
ans+=qwq[i].v;
if (qxq==r-1) break;
}
}
printf("%d\n",ans);
return 0;
}

