九度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
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 ****************************************************************/