首页 > 其他分享 >POJ 1505(二分+贪心)

POJ 1505(二分+贪心)

时间:2023-05-29 19:32:53浏览次数:43  
标签:cnt int sum 页数 vis book POJ 1505 贪心


题意:给一些书,这些书有不同的页数,让把这些书分成k份,必须是连续的,问这些份中页数和的最大值最小是多少。

解题思路:知道了页数和的范围,而且书都是连续的,要找到页数和最大值的最小值可以直接二分答案。。

AC:

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;

const int MAXM = 505;
int m,k;
int book[MAXM];
bool vis[MAXM];

int divide(int x)
{
	int sum=0,cnt=1;
	memset(vis,false,sizeof(vis));
	for(int i=m;i>=1;i--)
	{
		sum+=book[i];
		if(sum>x)
		{
			cnt++;
			sum=book[i];
			vis[i]=true;
		}
	}
	return cnt;
}

void print()
{
	cout<<book[1];
	for(int i=2;i<=m;i++)
	{
		if(vis[i-1]) cout<<" /";
		cout<<' '<<book[i];
	}
	cout<<endl;
}

int main()
{	
	int cas;
	cin>>cas;
	while(cas--)
	{
		cin>>m>>k;
		int l=0,r=0,mid=0;;
		for(int i=1;i<=m;i++)
		{
			cin>>book[i];
			r+=book[i];
			if(l<book[i]) l=book[i];
		}
		while(l<r)	//二分搜索最大值中的最小值(参见刘汝佳《算法竞赛入门经典》P151)
		{
			mid=(l+r)>>1;
			if(divide(mid)<=k) r=mid;	//这里不能是r=mid-1,原因可参见《算法竞赛入门经典》
			else l=mid+1;
		}
		int cnt=divide(r);
		for(int i=1;i<=m && cnt<k;i++)	//可能分得不足k次,那么就把前面的每一本书分给一个人超(题目要求)
		{
			if(!vis[i])
			{
				vis[i]=true;
				cnt++;
			}
		}
		print();
	}
	return 0;
}




标签:cnt,int,sum,页数,vis,book,POJ,1505,贪心
From: https://blog.51cto.com/u_16143128/6373673

相关文章

  • poj 3411(DFS多点访问)
    题意:有n座城市和m(1<=n,m<=10)条路。现在要从城市1到城市n。有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱,如果没有去过就付R的钱。求的是最少要花多少钱。解题思路:这道题的n与m都很小,dfs可以搞定,但这里与以往的搜索不同,以前dfs每个节点只能够访问一次,这里有多次访......
  • CV的人有福啦!YTU贪心训练2(部分注释,更新ing)
    ------------恢复内容开始------------无聊做了做(虽然第一题被水了)1743ProblemA1#include<bits/stdc++.h>2usingnamespacestd;3constintN=100010;4intn,k,s[N],a[N],sum[N],ans,x,y,res;5intmain()6{7cin>>n>>k;8for(inti=0;i&l......
  • POJ 1797 Heavy Transportation(迪杰斯特拉最短路变形)
    传送门题意分析:Hugo想要扩展他的公司,他有起重机要到目的地,到达目的地有很多条路径,但是,每一条路都有相应承重量,现在需要找出到达目的地的最大承重道路的承重质量。解题分析:首先,每一条路径的承重量取决于承重量最小的那条道路(短板效应),所以就是找所有路径的最小值,然后选择最小值最大的......
  • POJ 1753 Flip Game(枚举+递归)
    传送门思路是别人的,自己理解了半天,真是渣渣。对于自己,路还长,年轻人。对任意一个格子来说,翻动偶数次等于没翻,翻动奇数次等于翻一次,所以只需考虑翻一次的情况。一共16个格子,每个格子只有翻和不翻,所以最多16步,最少0步,题目要求最少的步数,所以0——>16枚举,看哪一步先成功就是最优解。使......
  • POJ 3069 Saruman's Army(贪心)
    传送门这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内我们使用的是贪心算法,也就是我们要将被标记的点尽可能的朝右边去即可,首先我们将他们从左到右进行排序,第一个我们所选取的被标记的点应该是能够包含掉左边的点的最靠右的点。。。......
  • POJ 1182 食物链
    解题思路:并查集经典中的经典题,在网上看了很多大牛的思路,大部分是增加一个结构体存动物间的关系,结合并查集判断,但是关系域的更新比较复杂,一下子不太容易理解。所以就有人另开思路,这里介绍一个十分巧妙的思路。一般我们都会把一个动物当成一个节点,然后去执行并查集等操作。但是有位大......
  • POJ 2251 Dungeon Master(三维BFS)
    题目看起来很厉害,实际上看懂了并不难,开一个三维的数组,这里需要注意的是第一维是高度,然后就是简单的BFS了,还有不同就是三维的时候有六个方向可以走,在前后左右的基础上多了一个向上和向下的走法,还有一个问题就是多个输入样例要注意每次都要初始化,我做的时候就因为这个WA了好几次,最后......
  • POJ 2080 Calendar
    题目链接:http://poj.org/problem?id=2080题目不是很难,也没什么说的,直接看代码吧:#include<iostream>#include<stdio.h>usingnamespacestd;intyear(intm){ if(m%4==0&&m%100!=0||m%400==0) return1; else return0;}intmain(){ intn,i,j......
  • 区分PO、VO、 BO、 DTO、 POJO
     分层领域模型规约:DO(DataObject):此结构与数据库表结构一一对应,通过DTO向上传输数据源对象。DTO(DataTransferObject):数据传输对象,Service或Manager向外传输的对象。BO(BusinessObject):业务对象,由Service层输出的封装业务逻辑的对象。AO(ApplicationObject):应用......
  • 算法学习记录(模拟枚举贪心题单):四舍五入(未AC)
    题目链接https://ac.nowcoder.com/acm/contest/20960/1004题目分析注意当第i位为9是,此时进位就是0,但是0<5,所以就不能再用i+1进行判断了。所以对于这种情况可以再添加一个其他变量。未AC代码//主要解决问题,因为使用i+1去判断是否要进位的//逢9进位后就会变成0,那么第i+1位......