【XDOJ】C语言综合题带练(2020期末真题)
最短距离
样例1示意图解释:
如图1所示,样例1共有4个结点,编号分别为1、2、3、4,后面括号里给出了结点坐标。下面总共有2个询问:
1 3:从1号结点到3号结点,路径可以选择123或者143,距离均为20;
1 4:从1号结点到4号结点,最短路径应为14,最短距离为10。
#include <stdio.h>
#include <math.h>
int max(int x,int y)
{
int t;
t=x>y?x:y;
return t;
}
int min(int x,int y)
{
int t;
t=x<y?x:y;
return t;
}
double MIN(double x,double y)
{
double t;
t=x<y?x:y;
return t;
}
struct point
{
int num;
double x,y;
};
int main()
{
int n,i,a[10],b[10],count=1,c,d,j;
scanf("%d",&n);
struct point per[n];
double s[10],l=0,x[10]={0},p[10];
for(i=1;i<=n;i++)
scanf("%d %lf %lf",&per[i].num,&per[i].x,&per[i].y);
for(i=1;;i++)
{
scanf("%d %d",&a[i],&b[i]);
if(a[i]==0&&b[i]==0)
break;
count++;
}//记录询问个数
for(i=1;i<=n;i++)
{
if(i==n)
s[i]=sqrt((per[i].x-per[1].x)*(per[i].x-per[1].x)+(per[i].y-per[1].y)*(per[i].y-per[1].y));
if(i<n)
s[i]=sqrt((per[i].x-per[i+1].x)*(per[i].x-per[i+1].x)+(per[i].y-per[i+1].y)*(per[i].y-per[i+1].y));
l+=s[i];
}//计算相邻两点的距离
for(i=1;i<count;i++)
{
c=min(a[i],b[i]);
d=max(a[i],b[i]);
for(j=c;j<d;j++)//记录所询问两点间需要经历的点
x[i]+=s[j];
p[i]=MIN(x[i],l-x[i]);//此处数据均为double型,比较两种路径的长度
printf("%.2lf\n",p[i]);
}
}
懒人游戏
#include <stdio.h>
#include <math.h>
int main()
{
int n,i,j,MIN,num[100];
scanf("%d",&n);
double s[100]={0},d[100],min,x[100],y[100];
for(i=0;i<n;i++)
{
scanf("%d %lf %lf",&num[i],&x[i],&y[i]);
}
for(i=0;i<n;i++)
{
s[i]=0;//s[i]在每次循环前都要置0
for(j=0;j<n;j++)
{
d[j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
s[i]+=d[j];//计算到此同学的距离之和
}
}
min=s[0];
for(i=0;i<n;i++)
{
if(s[i]<=min)
{
min=s[i];
MIN=i;
}
}//找到最短距离并记录位置
printf("%d %.2lf",num[MIN],min);
}
快速洗牌
有54张牌,牌面分别为2、3、4、5、6、7、8、9、10、J、Q、K、A、W。其中W有2张,包含两种花色,分别为red和black,其余牌面每种均有4张,包含四种花色,分别为heart、spade、club、diamond。接下来执行洗牌操作,将牌的位置改变为指定位置。例如有5张牌,排列顺序为:heart-3、spade-K、club-10、diamond-A、red-W,给定洗牌操作序列{4,2,5,3,1},即把heart-3放到4号位、spade-K放到2号位、club-10放到5号位、diamond-A放到3号位、red-W放到1号位,于是排序就变成了red-W、spade-K、diamond-A、heart-3、club-10。如果要将上面的洗牌操作执行第2次,则最后的洗牌结果为club-10、spade-K、heart-3、red-W、diamond-A。
#include <stdio.h>
struct draw
{
char p[54];
char q[54];
};
int main()
{
int n,i,j,k,t,m[54];
scanf("%d",&n);
struct draw per[n],each[n];
for(i=0;i<n;i++)
{
scanf("%s%s",per[i].p,per[i].q);
}
scanf("%d",&k);
for(i=0;i<n;i++)
scanf("%d",&m[i]);
for(i=0;i<k;i++)
{
for(j=0;j<n;j++)
{
t=m[j]-1;
each[t]=per[j];
}
for(j=0;j<n;j++)
{
per[j]=each[j];
}//此处第一次循环结束后,需要将得到的结果再赋给per
}
for(i=0;i<n;i++)
{
printf("%s %s",each[i].p,each[i].q);
printf("\n");
}
}