zoukankan      html  css  js  c++  java
  • 2013年湘潭大学程序设计比赛(Internet) D题 F题 题解

    比赛的时候实在有够憋屈。~

    一开始就做了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 }
  • 相关阅读:
    360°视频论文调研
    360°视频相机调研
    Oculus VR眼镜调研
    VR论文调研
    3ds Max学习日记(十)——显示场景资源管理器
    最近在学习Flask框架,那么就说下jinja2吧~~~
    最近学习了Sqlite3数据库,写一下操作应用以及命令
    HTML5游戏开发,剪刀石头布小游戏案例
    jquery简单的图片切换效果,支持pc端、移动端的banner图片切换开发
    jquery简单的大背景banner图片全屏切换
  • 原文地址:https://www.cnblogs.com/nuoyan2010/p/2955500.html
Copyright © 2011-2022 走看看