acmclub 周赛~

问题 A : 购物停车

时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:53
解决: 42

题目描述

小明每周都要开车陪女朋友去商业街购物,商业街是一条笔直的大街,我们把它抽象成是X轴上的一条线段,街上的每个商铺都位于线段上整数点的位置,而顾客可以在线段上的任何一个位置停车,并且每停一次车都需要交一次费用。于是小明想知道如果自己就停一次车,然后步行去之前计划好要去的那些商铺,最后回到停车的位置,那么最短的步行路程是多少。

输入格式

输入的第一行为一个整数t(1<=t<=100),表示测试样例的组数。
接下来输入t组样例,每组输入占两行,第一行输入一个整数n(1<=n<=20),表示小明他们计划要去的商铺的个数,第二行输入n个整数,表示计划要去的那些商铺的位置,位置范围为[0,99]。

输出

对于每组输入,输出题目要求的最短的步行路程。

样例输入

2
4
24 13 89 37
6
7 30 41 14 39 42

样例输出

152
70


code:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
int main()
{
	int cas;
	cin>>cas;
	int num[10000];
	while(cas--)
	{
		int n;
		cin>>n;
		memset(num,0,sizeof(num));
		for(int i=0;i<n;i++)
		{
			cin>>num[i];
		}
		sort(num,num+n);
		//int p=0;
		cout<<(num[n-1]-num[0])*2<<endl;;
		
		
	
	}
	return 0;
}

问题 B : 会员分组

时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:59
解决: 24

题目描述

小明是学校电子竞技协会的会长,他想过一段时间组织一次协会内部的电子竞技比赛。但是为了让会员们能够尽量与自己实力相当的人比赛,小明决定将会员们按照当前的会员积分分成若干组,分组的方法如下:
对于一个会员,如果他的积分小于等于10,则分到“1”组;
如果积分大于10小于等于100,则分到最近的整十数组或“100”组,例如,积分为14的会员分到“10”组,积分为15的会员分到“20”组,积分为99的会员分到“100”组;
如果积分大于100小于等于1000,则分到最近的整百数组或“1000”组;
如果积分大于1000小于等于10000,则分到最近的整千数组或“10000”组;
具体例子请参考输入输出样例。

输入格式

输入的第一行为一个整数n(1<=n<=100),表示测试数据的组数。
接下来n行,每行输入一个整数x(0<=x<=99999999),表示一个会员的积分。

输出

对于每个输入的会员积分,输出该会员被分到的组。

样例输入

9
15
14
4
5
99
12345678
44444445
1445
446

样例输出

20
10
1
1
100
10000000
50000000
2000
500



code:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
int main()
{
    int n;
    int cas;
    cin>>cas;
    while (cas--)
    {
        cin>>n;
        if (n<=10)
        {
            cout<<1<<endl;
        }
        else if (n==100)
            cout<<100<<endl;
        else if (n>=10&&n<=100)
        {
            if (n%10>=5)
            {
                cout<<(n/10+1)*10<<endl;
            }
            else
                cout<<n/10*10<<endl;
        }
        else
        {
            int countn=0;
            while (n/10)
            {
                if (n%10>=5)
                    n=n/10+1;
                else
                    n=n/10;
                countn++;
            }
            for (int i=1;i<=countn;i++)
            {
                n=n*10;
            }
            cout<<n<<endl;

        }
    }
    return 0;
}

/*
9

15

14

4

5

99

12345678


44444445

1445

446



*/

问题 C : 班级聚会上的游戏

时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:45
解决: 16

题目描述

前不久小明所在的班级为了庆祝在运动会上夺得第一名,开了一场班级聚会。在聚会上大家玩了这样一个游戏:
在地上放一个圆形硬纸片,然后参加游戏的人手里拿一个尺寸随机的圆形硬纸片,向地上的硬纸片扔过去,如果两个圆形硬纸片有相交的部分,则可以获得一次抽奖的机会。
现在,告诉你两个圆形硬纸片的圆心坐标和半径长度,请你计算它们相交的面积。

输入格式

输入包含多组测试数据。
每组输入为一行,输入6个实数x1,y1,r1,x2,y2,r2(-1000<=x1,y1,x2,y2<=1000,0<r1,r2<=1000),表示两个圆形硬纸片的圆心坐标和半径长度。

输出

对于每组输入,输出两个圆形硬纸片的相交面积,结果保留3位小数。

样例输入

20.0 30.0 15.0 40.0 30.0 30.0

样例输出

608.366

code:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
#define pi acos(-1.0)
struct node
{
    double x;
    double y;
    double r;
} c[1001];
double area(int i,double r1,int j,double r2)
{
    double d= sqrt((c[i].x-c[j].x)*(c[i].x-c[j].x)+(c[i].y- c[j].y)*(c[i].y-c[j].y));//圆心距
    if (r1>r2)
    {
        double temp=r1;
        r1=r2;
        r2=temp;
    }//r1取小
    if (r1+r2<=d)
        return 0;//相离
    else if (r2-r1>=d)
        return pi*r1*r1;//内含
    else
    {

        double a1=acos((r1*r1+d*d-r2*r2)/(2.0*r1*d));
        double a2=acos((r2*r2+d*d-r1*r1)/(2.0*r2*d));
        return (a1*r1*r1+a2*r2*r2-r1*d*sin(a1));
    }//相交
}
int main()
{
	int r1,r2;
//	int x1,y1,r1,x2,y2,r2;
	while(cin>>c[1].x>>c[1].y>>c[1].r>>c[2].x>>c[2].y>>c[2].r)
	printf("%0.3f\n",area(1,c[1].r,2,c[2].r));
	return 0;
	
}

问题 D : 拼火柴

时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:37
解决: 10

题目描述

有一天,小明心血来潮到化学实验室做实验,实验中要用到火柴,但是桌上没有,于是小明到别处翻箱倒柜找到了一袋子火柴,但是里面的火柴有的长度相等,有的长度不等。当小明做完实验的时候看着这些火柴突然想用它们拼正方形玩。
现在请你判断,小明随手拿出几根火柴,这些火柴能否按照头尾相接的方式拼成一个正方形,火柴不能折断来使用,并且每根火柴都必须使用上。

输入格式

输入的第一行为一个整数n(1<=n<=100),表示测试数据的组数。
接下来n行,每行先输入一个整数m(4<=m<=20),表示小明拿出的火柴个数,然后输入m个整数,每个数表示一根火柴的长度,火柴长度范围为[1,10000]。

输出

对于每组输入,如果能够拼成正方形,输出“yes”,否则输出“no”。

样例输入

3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5

样例输出

yes
no
yes


#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<cmath>
using namespace std;
int vis[25];
int num[25];
int pingjun;
int flag;
int n;
int cmp(int a,int b)
{
	return b<a;
}
int  dfs(int s,int cur,int countn,int pingjun)
{
	if(cur==pingjun)
	{
		countn++;
		cur=0;			
		s=1;
		if(countn==4)
		{
			flag=1;
			return 1;
		}
	}
	for(int i=s;i<=n;i++)
	{
		
		if(!vis[i]&&cur+num[i]<=pingjun)
		{
			vis[i]=1;			
			if(dfs(i+1,cur+num[i],countn,pingjun))
			return 1;
			vis[i]=0;
		}
	}
	return 0;
}
/*
void  dfs(int s,int cur,int countn,int pingjun)//这个超时,根本没改~ void 改成int 就过了?????~ 
{
	if(cur==pingjun)
	{
		countn++;
		cur=0;			
		s=1;
		if(countn==4)
		{
			flag=1;
			return ;
		}
	}
	for(int i=s;i<=n;i++)
	{
		
		if(!vis[i]&&cur+num[i]<=pingjun)
		{
			vis[i]=1;			
			dfs(i+1,cur+num[i],countn,pingjun);			
			vis[i]=0;
		}
	}	
}

*/
int main()
{
	int cas;
	scanf("%d",&cas);
	while(cas--)
	{
		memset(vis,0,sizeof(vis));
		memset(num,0,sizeof(num));
		scanf("%d",&n);
		int sum=0;
		for(int i=1;i<=n;i++)
		{
			
			scanf("%d",&num[i]);
			sum+=num[i];
		}
		sort(num+1,num+n+1,cmp);
	
		if(sum%4!=0)
		{
			printf("no\n");
			continue;
		}
		pingjun=sum/4;
		
	
			flag=0;
			dfs(1,0,0,pingjun);
			if(flag)
			printf("yes\n");
			else
			printf("no\n");
		
	}
	return 0;
}



























你可能感兴趣的:(acmclub 周赛~)