首页 > 其他分享 >[题目记录]一本通高手练习-软件开发

[题目记录]一本通高手练习-软件开发

时间:2024-12-03 19:21:26浏览次数:5  
标签:二分 高手 题目 软件开发 int mid 完成 软件 define

题意

有两个软件需要开发 , 每个软件分为 \(m\) 部分 , 把这总共 \(2m\) 个任务分配给 \(n\) 个人 , 每个人完成软件1 , 软件2的一部分所消耗的时间分别为 \(a_i,b_i\) , 这 \(n\) 个人同时工作 , 完成的时间就是这 \(n\) 个人最慢的一个人完成他的所有任务的时间 . 通过分配任务 , 最小化完成时间 .

$n,m,a_i,b_i \le 100 $

题解

简单地构造分配方案是复杂的 . 因此转向二分答案 .

转化后因为已知时间限制 , 可以枚举每个人完成任务1的个数同时有对应最多能完成任务2的个数 .

问题转为平凡的背包 , 即 \(f_{i,j}\) 为考虑前 \(i\) 个人做 \(j\) 个任务1 , 能够完成的任务2的最多个数 . 复杂度 $O(n^3\log n) $ .

点击查看代码
#include<bits/stdc++.h>
#define file(x) freopen(#x ".in","r",stdin),freopen(#x ".out","w",stdout)
#define int long long
#define INF 0x7fffffff
#define INF64 1e18
using namespace std;

constexpr int N=105;

int n,m,a[N],b[N];
int f[N][N];

bool check(int t){
	memset(f,0,sizeof f);
	for(int i=0;i<=n;i++)
		for(int j=1;j<=m;j++) f[i][j]=-1e18;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			for(int k=j;k>=0;k--){
				if(t-(j-k)*a[i]<0) break;
				f[i][j]=max(f[i][j],f[i-1][k]+(t-(j-k)*a[i])/b[i]);
			}
		}
	}
	return f[n][m]>=m;
}
			
	

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
	int l=1,r=1e18,mid,res;
	while(l<=r){
		mid=l+r>>1;
		if(check(mid)) res=mid,r=mid-1;
		else l=mid+1;
	}
	cout<<res;
}


具有典型的转化特征的题目 . 关键在于剪枝掉不合理的思路 (例如本题中贪心,构造方向都不可行 ) , 能显然地看出当前能够针对当前矛盾做出的转化 (比如本题的二分,状态设计 ) . 再从每个转化带来的有利影响 ( 典型地 , 二分答案将最优性问题变成的存在性问题 ) 出发 , 进一步解决 .

标签:二分,高手,题目,软件开发,int,mid,完成,软件,define
From: https://www.cnblogs.com/youlv/p/18584855

相关文章

  • [题目记录]一本通高手训练-塔
    题意有\(n\)个数,每次可以合并相邻两个数为一个数,新的数的值是原来两个数的和.求最小操作次数,使得序列变为不降序列.\(case1:n\le3000\)\(case2:n\le1e5\)题解做法一一本通上给到的一种做法.首先设计状态\(f_{i,j}\)当前位置\(i\),上一次转移......
  • [题目记录]一本通高手训练-交换
    题意定义操作如下:用\(0\cdotsn-1\)的一个排列\({q_n}\)交换排列\({s_n}\):对\(s_i\)中的元素进行\(n-1\)次两两交换,第\(i\)次交换\(s_{q_i}\)和\(s_{q_{i+1}}\).当\(s_i=i\)时,求排列\(q_n\)的个数,使得用\(q_n\)交换\(s_n\)得到给定的排列......
  • 使用服务器docker搭建Pwn题目
    一、docker的安装1、安装前先卸载操作系统默认安装的dockersudoapt-getremovedockerdocker-enginedocker.iocontainerdrunc2、安装必要支持sudoaptinstallapt-transport-httpsca-certificatescurlsoftware-properties-commongnupglsb-release3、添加gpgKEY(阿......
  • 这个是哪个题目 spj 来着
    有一个数列\(a_1\sima_n\),如果存在\(l\simr\)使得\(2\midr-l+1\)而且\(a_{l+x}=a_{l+\frac{r-l+1}{2}+x}(0\lex\le\frac{r-l+1}{2})\)(即一个字符串连续出现两次),则\(a\)是平凡的。求问一个数列是不是平凡的。首先如果有相邻相同的,一定是平凡的。而且,一定第一位是相......
  • C++三级抽测题目(答案+题目)2
    今天我给大家出一套C++三级考题限时3小时,大家加油!!!题目1:求一个两位数的个位和十位的和说明从键盘读入一个两位的整数n,请求出这个两位整数个位和十位的和是多少?输入格式一个两位的整数n。输出格式一个整数,代表n个位和十位的和。样例输入数据124输出数据16......
  • 数商云电商软件开发公司:塑造电商新时代的智能解决方案
    一、引言:电商行业的现状与挑战近年来,随着移动互联网的普及和物流体系的完善,电商行业迎来了前所未有的发展机遇。然而,机遇与挑战并存,电商企业在享受市场红利的同时,也面临着诸多考验。例如,如何在海量数据中挖掘出有价值的信息,如何优化用户体验以提高用户粘性,如何构建高效、安全......
  • 软件开发中, Staging environment的作用
    在软件开发中,Stagingenvironment(预生产环境)是一个重要的环节,主要用于在软件正式上线前进行最终的测试和验证。以下是Stagingenvironment的主要作用:1.模拟生产环境环境一致性:Stagingenvironment尽可能地模拟生产环境,包括硬件配置、网络设置、数据库配置等,以确保在预生产......
  • 博主自留二叉树万字长文—>涵盖名词辨析 + 树的两种表示方法 + 所有特殊二叉树 + 图解
    玩转二叉树(概念+图解+例题代码详解)一、树的概念我们知道在计算机什么是树吗?是二月春风似剪刀吗?哈哈哈哈哈哈显然不是我们看下面这张图,可以观察到树的一些特征1、树的特征(1)树是非线性的数据结构,是递归定义的(连通性)(2)子树之间不能有任何交集(无环性)(3)一颗N......
  • C题目:文件
    题目:从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止。代码:#include<stdio.h>#include<stdlib.h>voidfile1(){FILE*fp;charch,filename[10];printf("请输入文件名:");scanf("%s",filename);getchar();if((fp=fop......
  • 软件开发 --- vue之nuxt
    1.Nuxt.js路由配置Nuxt.js 主要使用基于文件系统的路由(FileSystem Routing),无需手动配置路由:pages/├──index.vue#/├──about.vue#/about├──posts/│├──index.vue#/posts│└──[id].vue#/posts/:id动态路由......