您的位置:首页 > 其它

SDUT_2012省赛选拔赛2 部分题目

2012-04-05 21:14 393 查看
http://acm.hdu.edu.cn/vcontest/vtl/problemlist/showproblemlist/vtlid/3367

1009 原来比赛做过的一个题目,由于最近写了几个字典树的题目,所以我对每个姓名编号的时候用字典树写的可是不知道哪里出了错误,老是wa弄得整个比赛的心情一团糟,最后我直接暴枚举力标号,已提交a了。。郁闷啊。。。

思路:输入A找与A有公共朋友最多的B,如果和A有公共朋友最多且相等的话就按字典序输出。。

注意:在找A的后继的后继B时,1:B不能是A本身:2:也不能是A的直接朋友。相当于一个模拟找的过程。。

View Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define maxn 107
using namespace std;

const double pi = 2*acos(-1.0);
const double eps = 1e-8;
int n;
double a[maxn];
//cmp函数的书写更加清晰了
int cmp(double y)
{
if (y > eps) return 1;
else if (y < -eps) return -1;
else return 0;
}
double cal(double c)
{
double  sum = 0.0;
for (int i = 0; i < n; ++i)
{
// 首先满足三角形性质
if(cmp(c - (a[i] + a[i + 1])) >= 0)  return 1;
if(cmp(fabs(a[i] - a[i + 1]) - c) >= 0)  return -1;
double tmp = (a[i]*a[i] + a[i + 1]*a[i + 1] - c*c)/(2.0*a[i]*a[i + 1]);
sum += acos(tmp);
}
if (cmp(sum - pi) > 0) return 1;
else if (cmp(sum - pi) < 0) return -1;
else return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int i,t,cas = 1;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i = 0; i < n; ++i)
{
scanf("%lf",&a[i]);
}
a
= a[0];
double l = 0;
double r = 10000;
double m;
bool flag = false;
while (cmp(l - r) < 0)
{
m = (l + r)/2.0;
int tmp = cal(m);
//printf(">>%d\n",tmp);
if (tmp > 0)
r = m;
else if (tmp < 0)
l = m;
else
{
flag = true;
break;
}
}
if (flag)
{
printf("Case %d: %.3lf\n",cas++,m);
}
else
{
printf("Case %d: impossible\n",cas++);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: