某农业学校 算法设计与分析-实验1-分治

众数问题

问题描述:

  给定含有n 个元素的多重集合S,每个元素在S 中出现的次数称为该元素的重数。多重集S 中重数最大的元素称为众数。

例如,S={1,2,2,2,3,5}。

多重集S 的众数是2,其重数为3。

编程任务:

  对于给定的由n 个自然数组成的多重集S,编程计算S 的众数及其重数。

数据输入:

  输入数据由文件名为input.txt 的文本文件提供。文件的第1 行多重集S 中元素个数n;接下来的n 行中,每行有一个自然数。

结果输出:

  程序运行结束时,将计算结果输出到文件output.txt 中。输出文件有2 行,第1 行给出众数,第2 行是重数。

输入文件示例          输出文件示例

input.txt             output.txt

6                      2

1                      3

2

2

2

3

5

#include<bits/stdc++.h>
using namespace std;
int n;
map<int,int> mp;
int a[1010]; 

int main()
{
	/*
	int num=1;
    ifstream infile;
	infile.open("input.txt");
	if(!infile.is_open())
		cout << "Error opening file";
	else
	{
		int height;
		infile >> height;
		a[0]=height;
		for(int i=1;i<=height;i++)
		{
			int temp;
			infile >> temp;
			a[num]=temp;	
			num++;
		}
	}
	*/
	cin>>n;
	a[0]=n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=a[0];i++)
	{
		mp[a[i]]++;
	}
	int ansv=0,answ=0;
	//ansv用于记录最大的值,answ用于记录众数 
	for(int i=1;i<=a[0];i++)
	{
		if(mp[a[i]]>ansv)
		{
			ansv=mp[a[i]];
			answ=a[i];
		}
	}
	/*
	ofstream outfile("output.txt");
	outfile << answ<<endl<<ansv<< endl;
	outfile.close();
	*/
	cout << answ<<endl<<ansv<<endl;
	return 0;
}

邮局选址问题
问题描述:

  在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱地分布在不同的街区中。用x 坐标表示东西向,用y 坐标表示南北向。各居民点的位置可以由坐标(x,y) 表示。街区中任意2 点(x1,y1) 和(x2,y2) 之间的距离可以用数值|x1-x2|+|y1-y2| 度量。

居民们希望在城市中选择建立邮局的最佳位置,使n 个居民点到邮局的距离总和最小。

编程任务:

  给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。

数据输入:

  由文件input.txt 提供输入数据。文件的第1 行是居民点数n,1<=n<=10000。接下来n 行是居民点的位置,每行2 个整数x 和y,-10000<=x,y<=10000。

结果输出:

  程序运行结束时,将计算结果输出到文件output.txt 中。文件的第1 行中的数是n 个居民点到邮局的距离总和的最小值。

输入文件示例               输出文件示例

input.txt                  output.txt

5                          10

1 2

2 2

1 3

3 -2

3 3

#include<bits/stdc++.h>
using namespace std;
int n,x[10010],y[10010];

int main()
{
	/*
	ifstream infile("inputt.txt",ios::in);
	infile >>n;
	for(int i=1;i<=n;i++)
	{
		int xx,yy;
		infile>>xx>>yy;
		x[i]=xx;
		y[i]=yy;
	}
	*/
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i];
	}
	sort(x+1,x+n+1);
	sort(y+1,y+n+1);
	int t;
	if(n%2==0)
	{
		t=n/2;
	}
	else
	{
		t=n/2+1;
	}
	int xa=x[t],ya=y[t];
	//cout << t<< " "<< xa<<" "<<ya<<endl;
	int sx=0,sy=0;
	for(int i=1;i<=n;i++)
	{
		sx+=abs(x[i]-xa);
		sy+=abs(y[i]-ya);
	}
	cout << sx+sy<<endl;
	/*
	ofstream outfile("out.txt");
	outfile << sx+sy << endl;
	*/
	return 0;
}


集合划分问题

问题描述:

  n 个元素的集合{1,2,., n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2, 3,4}可以划分为15 个不同的非空子集如下:

{{1},{2},{3},{4}},

{{1,2},{3},{4}},

{{1,3},{2},{4}},

{{1,4},{2},{3}},

{{2,3},{1},{4}},

{{2,4},{1},{3}},

{{3,4},{1},{2}},

{{1,2},{3,4}},

{{1,3},{2,4}},

{{1,4},{2,3}},

{{1,2,3},{4}},

{{1,2,4},{3}},

{{1,3,4},{2}},

{{2,3,4},{1}},

{{1,2,3,4}}

其中,集合{{1,2,3,4}} 由1 个子集组成;集合{{1,2},{3,4}},{{1,3},{2, 4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2, 3,4},{1}} 由2 个子集组成;集合{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4}, {2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}} 由3 个子集组成;集合{{1},{2},{3},{4}} 由4 个子集组成。

编程任务:

  给定正整数n 和m,计算出n 个元素的集合{1,2,., n }可以划分为多少个不同的由m 个非空子集组成的集合。

数据输入:

  由文件input.txt 提供输入数据。文件的第1 行是元素个数n 和非空子集数m。

结果输出:

  程序运行结束时,将计算出的不同的由m个非空子集组成的集合数输出到文件output.txt 中。

输入文件示例            输出文件示例

input.txt               output.txt

4    3                      6

#include<bits/stdc++.h>
using namespace std;
int n,m,ans;

int dfs(int x,int y)
{
	if(y==1) return 1;
	if(x==y) return 1;
	return dfs(x-1,y-1)+y*dfs(x-1,y);
}

int main()
{
	/*
	ifstream infile("input.txt",ios::in);
	infile >>n;
	infile >> m;
	*/
	cin>>n>>m;
	ans=dfs(n,m);
	
	/*
	ofstream outfile("out.txt");
	outfile << ans << endl;
	*/
	cout << ans<<endl;
	return 0;
}

输油管道问题
问题描述:

  某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n 口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。

编程任务:

  给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。

数据输入:

  由文件input.txt 提供输入数据。文件的第1 行是油井数n,1<=n10000。接下来n 行是油井的位置,每行2 个整数x 和y,-10000<=x,y<=10000 。

结果输出:

  程序运行结束时,将计算结果输出到文件output.txt 中。文件的第1 行中的数是油井到主管道之间的输油管道最小长度总和。

输入文件示例       输出文件示例

input.txt           output.txt

5                       6

1 2

2 2

1 3

3 -2

3 3

#include<bits/stdc++.h>
using namespace std;
int n,x[10010],y[10010];

int main()
{
	cin>>n;
	/*
	ifstream infile("input.txt",ios::in);
	infile >>n;
	for(int i=1;i<=n;i++)
	{
		int xx,yy;
		infile>>xx>>yy;
		x[i]=xx;
		y[i]=yy;
	}
	*/
	for(int i=1;i<=n;i++)
	{
		cin>>x[i]>>y[i];
	}

	sort(y+1,y+n+1);
	int t;
	if(n%2==0)
	{
		t=n/2;
	}
	else
	{
		t=n/2+1;
	}
	int ya=y[t];
	//cout << t<< " "<< xa<<" "<<ya<<endl;
	int sy=0;
	for(int i=1;i<=n;i++)
	{
		sy+=abs(y[i]-ya);
	}
	cout << sy<<endl;
	/*
	ofstream outfile("out.txt");
	outfile << sy << endl;
	*/
	return 0;
}

整数因子分解问题

 大于1 的正整数n 可以分解为:n=x1*x2*…*xm。

例如,当n=12 时,共有8 种不同的分解式:

12=12;

12=6*2;

12=4*3;

12=3*4;

12=3*2*2;

12=2*6;

12=2*3*2;

12=2*2*3 。

编程任务:

  对于给定的正整数n,编程计算n 共有多少种不同的分解式。

数据输入:

  由文件input.txt 给出输入数据。第一行有1 个正整数n (1≤n≤2000000000)。

结果输出:

将计算出的不同的分解式数输出到文件output.txt 。

输入文件示例          输出文件示例

input.txt            output.txt

 12                      8

#include<bits/stdc++.h>
using namespace std;
int n;

int dfs(int x)
{
	if(x==1) 
		return 1;
		
	int sum=0;
	for(int i=2;i<=x;i++)
	{
		if(x%i==0)
		{
			sum+=dfs(x/i);
		}
	}
	return sum;
}

int main()
{
	/*
	instream infile("input.txt",std::in);
	infile >> n;
	*/
	cin>>n;
	if(n<1)
	{
		cout << "0";
		return 0;
	}
	cout << dfs(n);
	/*
	outstream outfile("out.txt");
	outfile << dfs(n)<<endl;
	*/
	return 0;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值