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 }