LA 3971 Assemble / 二分

本文介绍了一个基于二分查找的算法,用于从不同种类的物品中选择最佳组合,以实现总价不超过预算前提下的最高品质。该算法通过遍历每种类型的物品并应用二分查找来确定最优品质阈值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有n个物品 属性有 种类  名字(没用)价格 品质 每种类型选一个 使总价格不超过b  并且最小品质最大 二分品质

#include <cstdio>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1010;
int cnt;
int n,m;
map <string,int> id;
struct node
{
	int pri;
	int qua;
};
int ID(string s)
{
	if(!id.count(s))
		id[s] = cnt++;
	return id[s];
}
vector <node> a[MAXN];

bool ok(int q)
{
	int sum = 0,i,j;
	for(i = 0; i < cnt; i++)
	{
		int len = a[i].size();
		int cheap = m + 1;
		for(j = 0; j < len; j++)
		{
			if(a[i][j].qua >= q)
				cheap = min(cheap,a[i][j].pri);
		}
		if(cheap > m)
			return false;
		sum += cheap;
		if(sum > m)
			return false;
	}
	return true;
}
int main()
{
	char s1[30];
	char s2[30];
	int t;
	int i,j;
	int l,r,maxq;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		cnt = 0;
		maxq = 0;
		for(i = 0; i < n; i++)
			a[i].clear();
		id.clear();
		int p,q;
		for(i = 1;i <= n; i++)
		{
			scanf("%s %s %d %d",s1,s2,&p,&q);
			maxq = max(maxq,q);
			a[ID(s1)].push_back((node){p,q});
		}
		l = 0;
		r = maxq;		
		while(l < r)
		{
			int M = l + (r-l+1)/2; //(l+r)>>1 这样会超时的 
			if(ok(M))
				l = M;
			else
				r = M - 1;
		}
		printf("%d\n",l);
	}
	return 0;
}


 

function [errL2, errH1 ] = Wucha(h) % CR元有限元方法求解泊松方程 -Δu = f % h为网格尺寸 % euL2为L2误差,euH1为H1半范误差 % 计算网格参数 n = 1.0/h; % 每个方向的单元数 NT = 2*n^2; % 三角形单元总数 % 调用网格生成函数 [Pxy, TP, Te] = PaoFen(h); N = max(Te(:)); % 自由度总数(边中点数量) % 生成网格节点、单元和边信息 TP1 = TP(:,1); TP2 = TP(:,2); TP3 = TP(:,3); % 三角形三个顶点的索 % 三角形边 Te1 = Te(:,1); Te2 = Te(:,2); Te3 = Te(:,3); % 获取三角形顶点坐标 x1 = Pxy(TP1,1); y1 = Pxy(TP1,2); x2 = Pxy(TP2,1); y2 = Pxy(TP2,2); x3 = Pxy(TP3,1); y3 = Pxy(TP3,2); % 计算单元面积和基函数梯度 st = 0.5*h^2; % 三角形单元面积 % 计算形函数梯度(Crouzeix-Raviart元在边中点处定义) grad1(:,1) = -2*(y2-y3)/(2*st); grad1(:,2) = -2*(x3 - x2)/(2*st); grad2(:,1) = -2*(y3-y1)/(2*st); grad2(:,2) = -2*(x1 - x3)/(2*st); grad3(:,1) = -2*(y1-y2)/(2*st); grad3(:,2) = -2*(x2 - x1)/(2*st); % 计算梯度内积(用于构建刚度矩阵) g1g1 = grad1(:,1).*grad1(:,1) + grad1(:,2).*grad1(:,2); g1g2 = grad1(:,1).*grad2(:,1) + grad1(:,2).*grad2(:,2); g1g3 = grad1(:,1).*grad3(:,1) + grad1(:,2).*grad3(:,2); g2g2 = grad2(:,1).*grad2(:,1) + grad2(:,2).*grad2(:,2); g2g3 = grad2(:,1).*grad3(:,1) + grad2(:,2).*grad3(:,2); g3g3 = grad3(:,1).*grad3(:,1) + grad3(:,2).*grad3(:,2); A = zeros(N, N); % ---------------------- 组装刚度矩阵 ---------------------- % 1. 处理第一个顶点对应的行(Te(:,1) 行) ii = Te(:,1); % 行索引:所有单元的第一个边索引 % 列索引:第一个边索引(对角线) jj = Te(:,1); A(ii, jj) = A(ii, jj) + g1g1 .* st; % 累加 (i,i) 元素 % 列索引:第二个边索引(非对角线) jj = Te(:,2); A(ii, jj) = A(ii, jj) + g1g2 .* st; % 累加 (i,j) 元素 % 列索引:第三个边索引(非对角线) jj = Te(:,3); A(ii, jj) = A(ii, jj) + g1g3 .* st; % 累加 (i,k) 元素 % 2. 处理第二个顶点对应的行(Te(:,2) 行) ii = Te(:,2); % 行索引:所有单元的第二个边索引 % 列索引:第一个边索引(对称项,与上面的 (j,i) 对应) jj = Te(:,1); A(ii, jj) = A(ii, jj) + g1g2 .* st; % 累加 (j,i) 元素 % 列索引:第二个边索引(对角线) jj = Te(:,2); A(ii, jj) = A(ii, jj) + g2g2 .* st; % 累加 (j,j) 元素 % 列索引:第三个边索引(非对角线) jj = Te(:,3); A(ii, jj) = A(ii, jj) + g2g3 .* st; % 累加 (j,k) 元素 % 3. 处理第三个顶点对应的行(Te(:,3) 行) ii = Te(:,3); % 行索引:所有单元的第三个边索引 % 列索引:第一个边索引(对称项,与上面的 (k,i) 对应) jj = Te(:,1); A(ii, 为什么这样求出来的A矩阵是非奇异?怎么修改
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值