考查点:最小生成树
小感:
提交情况:2次RE
AC_Code:
- #include <iostream>
- using namespace std;
- bool visited[2001];
- int dis,mini,totaldistance,lowcost[2001];
- int cal_distance(char *a,char *b)
- {
- dis=0;
- for(int i=0;i<7;i++)
- if(a[i]!=b[i])
- dis++;
- return dis;
- }
- int prim(int num,char types[][8])
- {
- int v,temp=-1;
- totaldistance=0;
- visited[0]=true;
- for(int i=0;i<num;i++)
- lowcost[i]=cal_distance(types[0],types[i]);
- for(int i=1;i<num;i++)
- {
- mini=100;
- for(int j=0;j<num;j++)
- if(visited[j]==false&&lowcost[j]<mini)
- {
- mini=lowcost[j];
- v=j;
- }
- visited[v]=true;
- totaldistance+=mini;
- for(int j=0;j<num;j++)
- {
- temp=cal_distance(types[v],types[j]);
- if(visited[j]==false&&temp<lowcost[j])
- lowcost[j]=temp;
- }
- }
- return totaldistance;
- }
- int main()
- {
- int num;
- while (cin>>num)
- {
- if(num==0) break;
- for(int i=0;i<num;i++)
- visited[i]=false;
- char types[2001][8];
- for(int i=0;i<num;i++)
- cin>>types[i];
- cout<<"The highest possible quality is 1/"<<prim(num,types)<<"."<<endl;
- }
- return 0;
- }
还是最小生成树的问题。可能题目不太好懂,就是每个车有一个7位的编码,把每两个车编码中对应位字母不同的个数叫做这两个编码的长度。因为quality=1/sum(t
0,t
d),所以只要找到所有编码的继承关系使得形成的树的权值最小即可,即最小生成树。
RE了两次,开始以为是不是数组的大小没设置好,于是把7改成了该成了8,结果还是RE了。后来发现说变量v没有初始化,一下子发现是visited在使用完一次后没有重新赋值~粗心啊~本来还想到的~没有用scanf,不知道会不会快一点~最后的时间好像是500多MS~
还有,就是动态二维数组的申请,开始是这么想的,可是太菜了,不太会~别笑~嘿嘿~char types[][]不能赋给char **.