您的位置:首页 > 其它

南阳理工学院软件月赛

2016-03-28 23:03 375 查看
七龙珠

算法:多源最短路

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

输入

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: