比赛的时候实在有够憋屈。~
一开始就做了F题,以为这道题就是推推公式,也没什么特殊的地方。。。。
没想到被double类型的输出%f给吭了。。。
先讲一下F题。。
现在有总资金S,每年花费X,利润R;R放小1000倍
S0=S0;
S1=S0-X+(S0-X)*R;
S2=S1-X+(S1-X)*R;
将S1带入到S2。。S2=(S0-X)*(1+R)^2-(1+R)*X;
S3=(S0-X)(1+R)^3-[(1+R)^2+(1+R)]X
看上述的公式应该就可以发现规律了。。接下来不推了。。。
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 int main() 6 { 7 double S,X,R,tmp; 8 int T; 9 scanf("%d",&T); 10 while(T--) 11 { 12 scanf("%lf %lf %lf",&S,&X,&R); 13 if(R==0) 14 { 15 printf("%.0f\n",floor(S/X));continue; 16 } 17 if(S==X) 18 { 19 printf("1\n");continue; 20 } 21 if(S<X) 22 { 23 printf("0\n");continue; 24 } 25 R/=1000; 26 tmp=R*S-(1+R)*X; 27 if(tmp>=0) 28 { 29 printf("INF\n"); 30 } 31 else 32 { 33 tmp=(log(X)-log(-tmp))/log(1+R); 34 printf("%.0f\n",ceil(tmp)); 35 } 36 } 37 return 0; 38 }
D题
floy最短路+状态压缩Dp
状态为dp[i][j]i代表现在访问过的状态,j表示现在到达的点。
状态转移dp[i][j]=dp[i][k]+dist[k][j];
View Code
1 #include<iostream> 2 #include<stdio.h> 3 #include<math.h> 4 #include<stdlib.h> 5 #include<iomanip> 6 using namespace std; 7 struct Point 8 { 9 double x,y; 10 }point[20]; 11 int const N = 270000; 12 double dist[20][20],dp[N][20]; 13 double const inf = 1000000000.0; 14 int n; 15 double d; 16 double Min(double a,double b) 17 { 18 return a<b?a:b; 19 } 20 void floyd() 21 { 22 for(int i = 0;i<n;i++) 23 for(int k = 0;k<n;k++) 24 for(int j = 0;j<n;j++) 25 dist[i][j] = Min(dist[i][j],dist[i][k] + dist[k][j]); 26 } 27 28 double getdist(Point a,Point b) 29 { 30 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 31 } 32 33 void setmap() 34 { 35 for(int i = 0;i<n-1;i++) 36 for(int j = i+1;j<n;j++) 37 { 38 dist[i][j] = dist[j][i] = inf; 39 dist[i][i] = 0; 40 } 41 double dis; 42 for(int i = 0;i<n-1;i++) 43 for(int j = i+1;j<n;j++) 44 if( ( dis = getdist(point[i],point[j]) ) <= d ) 45 { 46 //printf("%lf\n",dis);system("pause"); 47 dist[i][j] = dist[j][i] = dis; 48 } 49 } 50 51 int main() 52 { 53 while(~scanf("%d%lf",&n,&d)) 54 { 55 for(int i = 0;i<n;i++) 56 scanf("%lf%lf",&point[i].x,&point[i].y); 57 setmap(); 58 // for(int i=0;i<n;i++) 59 // { 60 // for(int j=0;j<n;j++) 61 // { 62 // printf("%lf ",dist[i][j]); 63 // } 64 // printf("\n"); 65 // } 66 floyd(); 67 for(int i=0;i<(1<<n);i++) 68 { 69 for(int j=0;j<n;j++) 70 dp[i][j]=inf; 71 } 72 for(int i=0;i<n;i++) 73 { 74 dp[0][i]=0; 75 dp[1<<i][i]=0; 76 } 77 78 for(int p=1;p<(1<<n);p++) 79 { 80 for(int k=0;k<n;k++) 81 { 82 if(p&(1<<k)) 83 { 84 int i=p&(~(1<<k)); 85 for(int j=0;j<n;j++) 86 { 87 if(i&(1<<j)) 88 { 89 //printf("p=%d k=%d i=%d j=%d\n",p,k,i,j); 90 dp[p][k]=Min(dp[p][k],dp[i][j]+dist[j][k]); 91 //printf("dp[%d][%d]=%lf",p,k,dp[p][k]);system("pause"); 92 } 93 } 94 } 95 } 96 } 97 int cur=(1<<n)-1; 98 double answer=inf; 99 for(int i=0;i<n;i++) 100 answer=Min(answer,dp[cur][i]); 101 if(answer>=inf) 102 printf("-1\n"); 103 else 104 printf("%.2f\n",answer); 105 //cout<<setiosflags(ios::fixed)<<setprecision(2)<<answer<<endl; 106 107 } 108 }