九度oj 1031 xxx定律 2009年浙江大学计算机及软件工程研究生机试真题

题目1031:xxx定律

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:5153

解决:3298

题目描述:
    对于一个数n,如果是偶数,就把n砍掉一半;如果是奇数,把n变成 3*n+ 1后砍掉一半,直到该数变为1为止。
    请计算需要经过几步才能将n变到1,具体可见样例。
输入:
    测试包含多个用例,每个用例包含一个整数n,当n为0 时表示输入结束。(1<=n<=10000)
输出:
    对于每组测试用例请输出一个数,表示需要经过的步数,每组输出占一行。
样例输入:
3
1
0
样例输出:
5
0
来源:
2009年浙江大学计算机及软件工程研究生机试真题
 1 #include <cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<string>
 5 #include<cstring>
 6 #include<vector>
 7 using namespace std;
 8 struct point{
 9     int dis,cost;
10 };
11 point p[1005];
12 int map[1005][1005][2];
13 #define inf 999999999
14 int main(){
15     //freopen("D://INPUT.txt","r",stdin);
16     int n,m;
17     while(cin>>n>>m&&n&&m){
18     int i=0,j;
19     for(i=1;i<=n;i++){
20         for(j=1;j<=n;j++){
21             map[i][j][0]=inf;
22             map[i][j][1]=inf;
23         }
24     }
25     i=0;
26     for(;i<m;i++){
27         int a,b;
28         cin>>a>>b;
29         cin>>map[b][a][0]>>map[b][a][1];
30         map[a][b][0]=map[b][a][0];
31         map[a][b][1]=map[b][a][1];
32     }
33     int s,e;
34     cin>>s>>e;
35     //cout<<s<<e<<endl; 
36     p[s].cost=0;
37     p[s].dis=0;
38     i=1;
39     for(;i<=n;i++){
40         if(i==s)
41         continue;
42         p[i].dis=map[s][i][0];
43         p[i].cost=map[s][i][1];
44     }
45     i=1;
46     for(;i<n;i++){
47         int j,min=inf,k;
48         for(j=1;j<=n;j++){
49             if(p[j].dis&&p[j].dis<min){
50                 min=p[j].dis;
51                 k=j;
52             }
53         }
54         if(k==e){
55             break;
56         }
57         for(j=1;j<=n;j++){
58             if(p[j].dis>p[k].dis+map[k][j][0]){
59                 p[j].dis=p[k].dis+map[k][j][0];
60                 p[j].cost=p[k].cost+map[k][j][1];
61             }
62             else{
63                 if(p[j].dis==p[k].dis+map[k][j][0]){
64                     p[j].cost=p[k].cost+map[k][j][1]>p[j].cost?p[j].cost:p[k].cost+map[k][j][1];
65                 }
66             }
67         }
68         p[k].dis=0;
69     }
70     cout<<p[e].dis<<' '<<p[e].cost<<endl;
71     }
72     return 0;
73 }
74 /**************************************************************
75     Problem: 1008
76     User: Deribs4
77     Language: C++
78     Result: Accepted
79     Time:20 ms
80     Memory:9416 kb
81 ****************************************************************/
View Code

 

posted @ 2015-02-14 17:37  Deribs4  阅读(165)  评论(0编辑  收藏  举报