week3作业

题目一 选数问题

题目描述

Given n positive numbers, ZJM can select exactly K of them that sums to S. Now ZJM wonders how many ways to get it

input

The first line, an integer T<=100, indicates the number of test cases. For each case, there are two lines. The first line, three integers indicate n, K and S. The second line, n integers indicate the positive numbers.

output

For each case, an integer indicate the answer in a independent line.

example

input 1

1
10 3 10
1 2 3 4 5 6 7 8 9 10

output 1

4

做法与思路

一个比较典型的深搜问题,但值得注意的是如果单纯深搜会引起重复问题,如样例可能会出现1 4 5和4 5 1当做两种情况,实质上它们选择的数据是一样的。我们注意到按照深搜标准,如果已经达到了4作为第一个所选数的时候,那么1 4,2 4,3 4在之前必然已经出现过,所以选择的n个数应是递增关系,这样就可以保证某组数的唯一性。我这里额外声明了一个dana变量来记录当前所选数字,保证后面的数字都要比它大,从而去重。
关于终止条件,如果和大于给定值,跳出。所选数超过定值数目,跳出。等于给定值时所选个数不等于给定数目,跳出。这一点比较好判断。

代码

#include <iostream>
#include <cstring>
using namespace std; 
int a,b,c;//数据长度、选择数量、和 
int numble;//记录种类数 
int d[1000];
bool vis[1000];
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void dfs(int sum,int x,int dana)//当前的和及选择数量 
{
	if(sum>c)
	return ;
	if(sum==c)
	{
		if(x==b)
			numble++;
		return ;
	}
	if(x>b) return;
	for(int i=dana;i<a;i++)
	{
		if(vis[i]==0)
		{
			vis[i]=1;
			dfs(sum+d[i],x+1,i+1);
			vis[i]=0;
		}
	}
}
int main(int argc, char** argv) {
	int tnumble;
	cin>>tnumble;
	for(int i=0;i<tnumble;i++)
	{
		memset(vis,0,sizeof(vis));
		numble=0;
		cin>>a>>b>>c;
		for(int j=0;j<a;j++)
		{
			cin>>d[j];
		}
		dfs(0,0,0);
		cout<<numble<<endl;
	}
	return 0;
}

题目二 区间选点

题目描述

数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

input

第一行1个整数N(N<=100)
第2~N+1行,每行两个整数a,b(a,b<=100)

output

一个整数,代表选点的数目

example

input 1

2
1 5
4 6

output 1

1

input 2

3
1 3
2 5
4 6

output 2

2

做法与思路

由于上课时已经介绍过做法,所以并没有花费多少时间。
我们要选最少的点,所以要尽可能让每个点覆盖最多的区间。首先将所有区间按照右端点进行排序,把点在不离开区间的情况下尽可能的放在右边。直到下一个区间的左端点在点的右侧时(此时不得不增加新点),在新区间的右端放置新端点即可.

代码

#include <iostream>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct range{
	int a,b;
	range()
	{
		a=0;b=0;
	}
};
bool bijiao(range t1,range t2)
{
	return t1.b<t2.b;
}
int main(int argc, char** argv) {
	int numble_of_range;
	int numble=0;//选点的个数 
	cin>>numble_of_range;
	int judge=0;
	range t[100];
	for(int i=0;i<numble_of_range;i++)
	{
		int x,y;
		cin>>x>>y;
		t[i].a=x;
		t[i].b=y;
	}
	sort(t,t+numble_of_range,bijiao);
	for(int i=0;i<numble_of_range;i++)
	{
		if(t[i].a>judge)
		{
			judge=t[i].b;
			numble++;
		}
	}
	cout<<numble;
	return 0;
}

题目三 区间覆盖

题目描述

数轴上有 n (1<=n<=25000)个闭区间 [ai, bi],选择尽量少的区间覆盖一条指定线段 [1, t]( 1<=t<=1,000,000)。
覆盖整点,即(1,2)+(3,4)可以覆盖(1,4)。
不可能办到输出-1

input

第一行:N和T
第二行至N+1行: 每一行一个闭区间。

output

选择的区间的数目,不可能办到输出-1

example

input 1

3 10
1 7
3 6
6 10

output 1

2

做法与思路

某种程度上与第二题有些类似,要使每个区间尽可能覆盖多的点。如对于线段上某数值为i的点,我们要在左端点小于等于i的区间中挑选出一个右端点最大的区间(不妨设右端点为b),新的起始点就变成了b,再以同样的贪心策略进行即可。如果中间出现断层,即所有区间的左端点都大于i,那么无法覆盖。
先根据区间的左端点对区间进行排序,以方便后来寻找可挑选的区间。

代码

#include <stdio.h>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct range{
	int a,b;
	range()
	{
		a=0;b=0;
	}
	range(int m,int n)
	{
		a=m;b=n;
	}
};
bool bijiao(range m,range n)
{
	return m.a<n.a;
}
range t[25000];
int main(int argc, char** argv) {
	int numble_of_range,finally;
//	cin>>numble_of_range>>finally;
	scanf("%d%d",&numble_of_range,&finally);
	for(int i=0;i<numble_of_range;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		t[i]=range(a,b);
	}
	sort(t,t+numble_of_range,bijiao);
	int judge=0;//记录上个区间的尾 
	int sum=0;
	int j=0;//记录上次搜索到的区间 
	while(judge<finally)
	{
		int maxium=judge;//记录右侧最远点 
		for(int i=j;i<numble_of_range;i++)
		{
			if(t[i].a<=judge+1)//两个区间必须相邻 
			{
				maxium=max(t[i].b,maxium);//第二个区间里选一个右侧最远的
				j=i; 
			}
			else break;
		}
		if(maxium<=judge)//没找到更远的右侧点
		{
			printf("-1");
			return 0;
		}
		judge=maxium;
		sum++;
	}
	printf("%d",sum);
	return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值