2019 01 22考试总结
StephenYoung · · 个人记录
忆中恨 书榜下
寒城凄切,骤雨初歇,疾风再起,望我分,不可及,时有苦笑心寒,急不可耐,慌莽一时,却回头,难再挽,竟无语,念无幸,千里烟波,万里冰封,更那堪,晓风无,残月仍,更与何人言?
待到应时,百种风情,一声怆然,似伊人,在水方,还在中心泱泱,彻夜辗转,反彻难眠,刹惊醒,痛无梦,又凝噎,思有苦,长空无鹰,浅底无鱼,怅寥廓,湿青衫,一回来,须信一回惘。
先谈谈列队一题吧。
此题玄之又玄(即有毒)我的想法是模拟出顺序,按照先左后前来,于是加上dfs,但是会遇上空间开爆的情况,看到有几组数据只有一排,于是想到特判一下骗一些分,但还是爆了。 下面附上错误代码。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
struct Edge{
int x;int y;
}e[300005];
int n,q,m,ans[300005],a[maxn][maxn],b[maxn][maxn];
void dfs1(int u,int xx,int yy)
{
if(u>q)
return ;
else
{
ans[u]=a[xx][yy];
if(yy!=m&&xx!=n)
{
b[xx][yy]=a[xx][yy];
for(int j=yy+1;j<=m;j++)
{
a[xx][j-1]=a[xx][j];
}
for(int i=xx+1;i<=n;i++)
{
a[i-1][m]=a[i][m];
}
a[n][m]=b[xx][yy];
}
if(yy==m&&xx!=n)
{
b[xx][yy]=a[xx][yy];
for(int i=xx+1;i<=n;i++)
{
a[i-1][m]=a[i][m];
}
a[n][m]=b[xx][yy];
}
if(xx==n&&yy!=m)
{
b[xx][yy]=a[xx][yy];
for(int j=yy+1;j<=m;j++)
{
a[xx][j-1]=a[xx][j];
}
a[n][m]=b[xx][yy];
}
if(xx==n&&yy==m)
{
a[n][m]=a[xx][yy];
}
}
dfs1(u+1,e[u+1].x,e[u+1].y);
}
void dfs2(int u,int xx,int yy)
{
if(u>q)
return ;
else
{
ans[u]=a[1][yy];
b[1][yy]=a[1][yy];
for(int j=yy+1;j<=m;j++)
{
a[1][j-1]=a[1][j];
}
a[n][m]=b[1][yy];
dfs2(u+1,e[u+1].x,e[u+1].y);
}
}
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
a[i][j]=(i-1)*m+j;
}
for(int i=1;i<=q;i++)
{
scanf("%d%d",&e[i].x,&e[i].y);
//dfs(1,e[1].x,e[1].y);
}
if(n!=1)
dfs1(1,e[1].x,e[1].y);
else if(n==1)
dfs2(1,e[1].x,e[1].y);
for(int i=1;i<=q;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}
奶酪只得了80,改正确了。
上code:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
const int MAXN=1010;
struct cir
{
double x,y,z;
bool operator<(const cir &cpr)const
{
return z<cpr.z;
}
}p[MAXN];
bool fnd=0;
int n;
double h,r;
bool vis[MAXN];
double dist(double x1,double y1,double z1,double x2,double y2,double z2)
{
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
}
void dfs(cir now,int num)
{
if(now.z+r>=h)
{
fnd=1;
return;
}
vis[num]=1;
for(int i=1;i<=n;i++)
{
if(fnd)
return;
if(!vis[i]&&dist(now.x,now.y,now.z,p[i].x,p[i].y,p[i].z)<=r*2)
dfs(p[i],i);
}
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
memset(p,0,sizeof(p));
fnd=0;
scanf("%d%lf%lf",&n,&h,&r);
for(int i=1;i<=n;i++)
scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);
std::sort(p+1,p+n+1);
for(int i=1;i<=n;i++)//lower
if(p[i].z-r<=0)
dfs(p[i],i);
if(fnd)
puts("Yes");
else
puts("No");
}
return 0;
}
宝藏不行,只打了个40的暴力,如下:
#include<bits/stdc++.h>```cpp
#include<bits/stdc++.h>
using namespace std;
int a[30], l[30],sum[30];
int cost[30][30];
int ans=2147483647,tmp=0,n,m,tot;
void dfs(int u,int num,int tmp)
{
if(num>=n)
{
ans=min(tmp,ans);
return ;
}
if(tmp>=ans) return;
for(int i=1;i<=n;i++)
{
if(l[i]) continue;
for(int j=1;j<=n;j++)
{
if(cost[j][i]==0x3f||!l[j]||j==i)
continue;
l[i]=1;
sum[i]=sum[j]+1;
dfs(i,num+1,tmp+cost[i][j]*sum[j]);
l[i]=0;
sum[i]=0;
tot--;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(cost,0x3f,sizeof(cost));
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
cost[x][y]=cost[y][x]=min(cost[x][y],z);
//cost[y][x]=cost[x][y];
}
for(int i=1;i<=n;i++)
{
memset(l,0,sizeof(l));
for(int i=1;i<=n;i++)
sum[i]=1;
l[i]=1;
dfs(i,1,0);
}
printf("%d",ans);
return 0;
}