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

若菜只会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 }
原文地址:https://www.cnblogs.com/wally/p/2980601.html