都是队友写的,放在一起。
HDU 4033 Regular Polygon
二分什么的。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
double dis[105];
int n;
const double eps=1e-8;
bool tt(double a,double b,double c){
if((a+b>c&&abs(a-b)<c)&&(a+c>b&&abs(a-c)<b)&&(b+c>a&&abs(b-c)<a))
return 1;
return 0;
}
int ff(double a,double b,double c){
if(a+b<=c)
return 2;
return 3;
}
int ok(double x){
double a,b,c;
double res=0;
for(int i=1;i<n;i++){
a=dis[i];
b=dis[i+1];
c=x;
if(tt(a,b,c)){
double det=acos((a*a+b*b-c*c)/(2.0*a*b));
res+=det;
}
else
return ff(a,b,c);
}
a=dis[n];b=dis[1];c=x;
if(tt(a,b,c)){
double det=acos((a*a+b*b-c*c)/(2.0*a*b));
res+=det;
}
else{
return ff(a,b,c);
}
if(fabs(res-2*acos(-1))<1e-8)
return 4;
else if(res>2*acos(-1))
return 5;
return 6;
}
int main(){
int T,tt=0;scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf",&dis[i]);
double tmp=eps;
double l=eps,r=1000000000.0;
for(int i=1;i<n;i++){
if(dis[i]+dis[i+1]>tmp){
tmp=dis[i]+dis[i+1];
if(tmp<r)
r=tmp;
}
}
printf("Case %d: ",++tt);
double key;
bool f=0;
while(fabs(r-l)>eps){
double mid=(l+r)/2;
int x=ok(mid);
if(x==4){
key=mid;
f=1;
break;
}
if(x==2||x==5){
r=mid;
}
else
l=mid;
}
if(f)
printf("%.3lf\n",key);
else
printf("impossible\n");
}
return 0;
}
HDU 4036
Rolling Hongshu
据说是DP。
ps:其实他不太会DP^_^
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
#define Max(x,y) (x>y? x:y)
#define Min(x,y) (x<y? x:y)
#define Seg(x) ((x>eps) - (x<-eps))
#define MAXN 1100
#define MAXM 10000100
#define g 20
using namespace std;
int t,n,m,cases=0;
double mm;
struct point
{
double x,y;
point(){}
point(double xx,double yy){x=xx;y=yy;}
}p[MAXN];
struct blue
{
double x,v,mm;
}ball[MAXN];
double dp[MAXN];
vector<int> vec[MAXN];
point Interpoint(point u1,point u2,point v1,point v2)//两相交直线交点
{
point ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/
((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
}
int main()
{
int i,j;
double ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%lf",&n,&m,&mm);
for(i=1;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(i=1;i<=m;i++)
scanf("%lf%lf%lf",&ball[i].x,&ball[i].v,&ball[i].mm);
for(i=0;i<=n;i++)
vec[i].clear();
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
for(j=1;j<n;j++)
{
if(Seg(ball[i].x-p[j].x)>=0&&Seg(ball[i].x-p[j+1].x)==-1)
vec[j].push_back(i);
}
memset(dp,0,sizeof(dp));
for(i=n-1;i>=1;i--)
{
if(vec[i].size()==0)
{
if(Seg(p[i].y-p[i+1].y)==1) //down
{
double ww=mm*g*(p[i].y-p[i+1].y);
double www=0.5*mm*dp[i+1]*dp[i+1];
if(Seg(www-ww)==1)
dp[i]=sqrt(((www-ww)*2)/mm);
else
dp[i]=0;
}
else if(Seg(p[i].y-p[i+1].y)==-1)
{
double ww=0.5*mm*dp[i+1]*dp[i+1]+mm*g*(p[i+1].y-p[i].y);
dp[i]=sqrt((ww*2)/mm);
}
else
dp[i]=Max(dp[i+1],dp[i]);
}
else
{
for(j=0;j<vec[i].size();j++)
{
point now=Interpoint(p[i],p[i+1],point(ball[vec[i][j]].x,0),point(ball[vec[i][j]].x,1));
if(Seg(p[i].y-p[i+1].y)==1) //down
{
double a=ball[vec[i][j]].v*ball[vec[i][j]].v;
double b=2*g*(p[i].y-now.y);
double ww,www;
if(Seg(a-b)<=0) ww=0;
else ww=sqrt(a-b);
a=dp[i+1]*dp[i+1];
b=2*g*(p[i].y-p[i+1].y);
if(Seg(a-b)<=0) www=0;
else www=sqrt(a-b);
dp[i]=Max(dp[i],ww);
dp[i]=Max(dp[i],www);
}
else if(Seg(p[i].y-p[i+1].y)==-1)
{
double a=ball[vec[i][j]].v*ball[vec[i][j]].v;
double b=2*g*(now.y-p[i].y);
double ww,www;
if(Seg(a+b)<=0) ww=0;
else ww=sqrt(a+b);
a=dp[i+1]*dp[i+1];
b=2*g*(p[i+1].y-p[i].y);
if(Seg(a+b)<=0) www=0;
else www=sqrt(a+b);
dp[i]=Max(dp[i],ww);
dp[i]=Max(dp[i],www);
}
else
{
dp[i]=Max(dp[i],ball[vec[i][j]].v);
dp[i]=Max(dp[i],dp[i+1]);
}
}
}
}
printf("Case %d: %.2lf\n",++cases,dp[1]);
}
}
HDU 4039
The Social Network
不知道是什么^_^
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<map>
using namespace std;
int peo[2010][2010];
map<string,int> my;
char peop[2010][20];
int flag[2010];
struct Ans{
char name[20];
};
Ans ans[2010];
bool cmp(Ans aa,Ans bb){
int temp=strcmp(aa.name,bb.name);
if(temp<0) return 1;
else return 0;
}
main(){
int i,ii,j,k,t,tt,n,q,plen,ansl,maxn;
char a[20],b[20];
scanf("%d",&t);
for(tt=1;tt<=t;tt++){
printf("Case %d:\n",tt);
memset(peo,0,sizeof(peo));
memset(peop,0,sizeof(peop));
scanf("%d%d",&n,&q);
my.clear();
plen=0;
for(i=1;i<=n;i++){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%s %s",a,b);
int tt1,tt2;
if(my[a]==0){
my[a]=++plen;
strcpy(peop[plen],a);
}
if(my[b]==0){
my[b]=++plen;
strcpy(peop[plen],b);
}
tt1=my[a];tt2=my[b];
peo[tt1][tt2]=peo[tt2][tt1]=1;
}
for(ii=1;ii<=q;ii++){
memset(flag,0,sizeof(flag));
memset(a,0,sizeof(a));
scanf("%s",a);
int temp=my[a];
for(j=1;j<=plen;j++){
if(peo[temp][j]){
for(k=1;k<=plen;k++){
if(!peo[temp][k]&&temp!=k&&peo[j][k]) flag[k]++;
}
}
}
maxn=0;ansl=0;
for(i=1;i<=plen;i++) if(flag[i]>maxn) maxn=flag[i];
if(maxn==0) printf("-\n");
else{
for(i=1;i<=plen;i++)
if(flag[i]==maxn){
memset(ans[ansl].name,0,sizeof(ans[ansl].name));
strcpy(ans[ansl++].name,peop[i]);
}
sort(ans,ans+ansl,cmp);
printf("%s",ans[0].name);
for(i=1;i<ansl;i++) printf(" %s",ans[i].name);
printf("\n");
}
}
}
}