hdu 4520+hdu 4522+hdu 4524(3月24号Tencent)

来源:互联网 发布:淘宝装修拓展编码大全 编辑:程序博客网 时间:2024/05/16 01:13

若菜只会3题,orz,继续刷题吧。。。

hdu 4520:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4520

思路:就是一个去掉最高分和最低分求平均分,在和原来的分数比较,看哪个裁判最接近。

View Code
 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4  5 int main(){ 6     int n; 7     double num[40]; 8     while(~scanf("%d",&n)&&n){ 9         double max=-1;10         double min=400;11         double sum=0;12         for(int i=0;i<n;i++){13             scanf("%lf",&num[i]);14             if(num[i]<min)min=num[i];15             if(num[i]>max)max=num[i];16             sum+=num[i];17         }18         sum=(sum-min-max)/(n-2);19         int pos=0;20         min=400;21         for(int i=0;i<n;i++){22             if(fabs(sum-num[i])<min){23                 min=fabs(sum-num[i]);24                 pos=i+1;25             }26         }27         printf("%d\n",pos);28     }29     return 0;30 }

hdu 4522:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4522

思路:就是求最短路,建两个图,一个是硬座的,一个是卧铺的,然后两次Dijkstra(orz,若菜只会这么干),如果不存在路径,就输出-1,否则,再比较花费。

View Code
  1 #include<iostream>  2 #include<cstring>  3 const int N=207;  4 const int inf=1e7;  5 using namespace std;  6 int dist1[N];  7 int dist0[N];  8 int visited[N];  9 int edge1[N][N]; 10 int edge0[N][N]; 11 int n,m,k; 12  13 void Dijkstra1(int u){ 14     memset(visited,0,sizeof(visited)); 15     for(int i=1;i<=n;i++){ 16         dist1[i]=edge1[u][i]; 17     } 18     visited[u]=1; 19     for(int i=1;i<n;i++){ 20         int min=inf,v=u; 21         for(int j=1;j<=n;j++){ 22             if(dist1[j]<min&&!visited[j]){ 23                 min=dist1[j]; 24                 v=j; 25             } 26         } 27         if(min==inf)return ; 28         visited[v]=1; 29         for(int k=1;k<=n;k++){ 30             if(!visited[k]&&edge1[v][k]<inf&&dist1[v]+edge1[v][k]<dist1[k]){ 31                 dist1[k]=dist1[v]+edge1[v][k]; 32             } 33         } 34     } 35 } 36  37 void Dijkstra0(int u){ 38     memset(visited,0,sizeof(visited)); 39     for(int i=1;i<=n;i++){ 40         dist0[i]=edge0[u][i]; 41     } 42     visited[u]=1; 43     for(int i=1;i<n;i++){ 44         int min=inf,v=u; 45         for(int j=1;j<=n;j++){ 46             if(dist0[j]<min&&!visited[j]){ 47                 min=dist0[j]; 48                 v=j; 49             } 50         } 51         if(min==inf)return ; 52         visited[v]=1; 53         for(int k=1;k<=n;k++){ 54             if(!visited[k]&&edge0[v][k]<inf&&dist0[v]+edge0[v][k]<dist0[k]){ 55                 dist0[k]=dist0[v]+edge0[v][k]; 56             } 57         } 58     } 59 } 60  61  62  63 int main(){ 64     int _case; 65     scanf("%d",&_case); 66     while(_case--){ 67         scanf("%d%d",&n,&m); 68         char str[10100]; 69         for(int i=1;i<=n;i++){ 70             for(int j=1;j<=n;j++){ 71                 edge1[i][j]=edge1[j][i]=inf; 72                 edge0[i][j]=edge0[j][i]=inf; 73             } 74         } 75         for(int i=1;i<=m;i++){ 76             scanf("%s%d",str,&k); 77             int len=strlen(str); 78             int s1=0,s2=0; 79             if(k==1){ 80                 for(int j=0;j<len;j++){ 81                     //这边一开始没注意到,re了好多次,orz 82                     while(str[j]!='+'&&j<len){ 83                         s2=s2*10+str[j]-'0'; 84                         j++; 85                     } 86                     edge1[s1][s2]=1;//卧铺的 87                     edge0[s1][s2]=1;//硬座的 88                     s1=s2; 89                     s2=0; 90                 } 91             }else if(k==0){ 92                 for(int j=0;j<len;j++){ 93                     while(str[j]!='+'&&j<len){ 94                         s2=s2*10+str[j]-'0'; 95                         j++; 96                     } 97                     edge0[s1][s2]=1;//硬座的 98                     s1=s2; 99                     s2=0;100                 }101             }102         }103         int d1,d2,u,v;104         scanf("%d%d%d%d",&d1,&d2,&u,&v);105         Dijkstra1(u);//开始是卧铺106         Dijkstra0(u);//开始是硬座107         if(dist1[v]==inf&&dist0[v]==inf){108             printf("-1\n");109         }else if(dist1[v]==inf&&dist0[v]<inf){110             printf("%d\n",dist0[v]*d1);111         }else if(dist1[v]<inf&&dist0[v]==inf){112             printf("%d\n",dist1[v]*d2);113         }else {114             printf("%d\n",min(dist1[v]*d2,dist0[v]*d1));115         }116     }117     return 0;118 }

hdu 4524:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4524

思路:就是最后所有的数都必须为0才能逃离迷宫,直接暴力之。

View Code
 1 #include<iostream> 2 using namespace std; 3 int num[1000007]; 4  5 int main(){ 6     int _case; 7     scanf("%d",&_case); 8     while(_case--){ 9         int n;10         scanf("%d",&n);11         for(int i=1;i<=n;i++){12             scanf("%d",&num[i]);13             if(num[i]>=num[i-1]){14                 num[i]-=num[i-1];15                 num[i-1]=0;16             }17         }18         int flag=0;19         for(int i=1;i<=n;i++){20             if(num[i]){21                 flag=1;22                 break;23             }24         }25         if(flag){26             printf("I will never go out T_T\n");27         }else 28             printf("yeah~ I escaped ^_^\n");29     }30     return 0;31 }

 

0 0
原创粉丝点击