南阳理工学院软件月赛

来源:互联网 发布:电子眼地图数据 编辑:程序博客网 时间:2024/04/29 02:19

七龙珠

算法:多源最短路

七龙珠散落在了各地,我们已经找到了一个龙珠并感应到了其他龙珠的所在城镇,问以某种顺序找齐七个龙珠(路过城镇可以不取走龙珠),最快几天能找齐?
输入

Input
第一行一个整数T(少于5组)表示测试数据组数,每组数据第一行 N(2<=N<=300个城镇),M(0<M<100),
之后有n+m行,前n行每行n个整数,第K行的L个数表示第K镇到第L镇的距离,之后m行每行6个整数表示取珠城市顺序(第一个整数为当前位置) 。(均在int范围内)

Output
每组数据m行,每行一个整数,最少需要的天数。

Sample Input
1
6 1
0 2 2 2 2 5
2 0 3 3 3 4
2 3 0 4 5 4
2 3 4 0 1 3
2 3 5 1 0 6
5 4 4 3 6 0
1 2 3 4 5 6
Sample Output
14
Hint
样例为1-2-3-4-5-4-6

一定要看清楚题!!

代码:

#include <iostream>#include <iomanip>#include <cstring>#include <algorithm>using namespace std;int main(){int n,m,i,j,k,T;int map[305][305];cin>>T;while(T--){cin>>n>>m;memset(map,0,sizeof(map));for(i=1;i<=n;i++)for(j=1;j<=n;j++)cin>>map[i][j];for(i=1;i<=n;i++)for(j=1;j<=n;j++)   for(k=1;k<=n;k++)    if(map[j][k]>map[j][i]+map[i][k])map[j][k]=map[j][i]+map[i][k];while(m--){int sta,en;int sum=0;cin>>sta;for(i=1;i<6;i++){cin>>en;sum+=map[sta][en];sta=en;}cout<<sum<<endl;} }return 0;} 


考古
考古专家发现了一个葬着多人的大墓穴,可是骨头杂乱无序堆在一起,考古学家现确定了某些对骨头应该是同一个人的,问这个洞穴中,最多葬了多少个人(木有骨头的肯定不用算了)。

Input
多组输入数据(少于100),每组第一行两个正整数N(小于1000表示骨头个数),M(之后M行会告诉你哪两个骨头是一个人的),当N为0时,输入结束,该用例不被处理。

Output
每组输出一个数,表示这里最多埋葬了多少人。

Sample Input
4 3
1 2
2 3
1 3
0
Sample Output
2

代码:

This code is shared.Copy#include <iostream>#include <iomanip>#include <cstring>#include <algorithm>using namespace std;int dp[1005],n;void inct(){for(int i=1;i<=n;i++)dp[i]=i;}int find(int x){while(x!=dp[x])x=dp[x];return x;}void build(int x,int y){int fx=find(x);int fy=find(y);if(fx!=fy)dp[fy]=fx;}int main(){int i,j,k,m;while(cin>>n&&n){inct();cin>>m;for(i=1;i<=m;i++){cin>>j>>k;build(j,k);}int sum=0;for(i=1;i<=n;i++)if(i==dp[i]) sum++;cout<<sum<<endl;}return 0;}


背包
有N种物品各一个,问是否能够凑成Mkg装到背包中。

Input
第一行一个整数T(T<=1000)测试数据组数,每组第一行为(1<N<=1000),M(1<m<=1000)两个正整数,第二行N个整数代表N种物品的质量Gi(小于1000)。

Output
可以凑成输出“Y”,否则输出“N”

Sample Input
2
3 5
1 2 3
3 7
1 2 3
Sample Output
Y
N

代码:

#include <iostream>#include <iomanip>#include <cstring>#include <algorithm>using namespace std;int dp[1005],n,m,ok;void dfs(int x,int sum){if(x<1) return ;if(ok) return ;if(sum==m) {ok=1;return ;}if(sum>m) return ;dfs(x-1,sum+dp[x]);dfs(x-1,sum);}int main(){int i,j,k,T;cin>>T;while(T--){cin>>n>>m;for(i=1;i<=n;i++)cin>>dp[i];ok=0;dfs(n,0);if(ok) cout<<"Y"<<endl;else cout<<"N"<<endl; }return 0;}

洞的编号

有N(N<1000)个洞围成一个圈编号(1-N),从1号洞开始走N次,分别走1^9步,2^9步,3^9步······N^9步,问此时所在的洞的编号。

Input
多组输入数据(不超过100组),每行一个正整数N。

Output
洞的编号

Sample Input
1
2
3
4
Sample Output
1
2
1
1

代码:

#include <iostream>#include <iomanip>#include <cstring>#include <algorithm>using namespace std;int main(){int i,j,k,n,m,p,q;while(cin>>n){int m=0;for(i=1;i<=n;i++){k=1;for(j=1;j<=9;j++)k=(k*i)%n;m=(m+k)%n; }cout<<m+1<<endl; }return 0;}


0 0