SDUT 2023 summer team contest(for 22) - 1-Gym - 102220

news2024/11/25 14:23:33

B - Balanced Diet

 题意:这题题意有点难搞啊,就是有n个物品,一个有m种,对于第 i 种物品如果你要买它就至少买 l[i]个,然后就是给你n行,每行两个数,ai,bi,表示这个糖果类型为bi,价值为ai(注意同一种类型的糖果价值可能不同),让你任意选1~n个糖果,让选的糖果的价值和除以你选的糖果中数量最多的那种糖果的数量的比值最大

思路:我们只需要枚举最多选几个,其余的也尽可能贪心的多选,但是不能超过我们枚举的最大值,具体见代码,写在注释上了

#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e5 + 1000, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int gcd(int a, int b)
{
	return b ? gcd(b, a % b) : a;
}
int n, m;
vector<int> g[N];
vector<int> val[N];
int sum[N];
int l[N];
bool cmp(int a, int b)
{
	return a > b;
}
void solve()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
		cin >> l[i]; // 第i种糖果最少买l[i]种
	for (int i = 1; i <= n; i++)
	{
		int a, b;
		cin >> a >> b;
		g[b].pb(a); // b种糖果价值a
	}
	for (int i = 1; i <= m; i++) // m种物品
	{
		sort(g[i].begin(), g[i].end(), cmp);
		for (int j = 0; j < g[i].size(); j++) // 枚举每一种物品选1~这个物品的最大值所有情况,注意有l[i]的限制,我们取max即可
		{
			val[max(l[i], j + 1)].pb(g[i][j]); //
		}
		g[i].clear();
	}
	int y = 0, x = 1, yy = 0, xx = 0;
	for (int i = 1; i <= n; i++)//这里枚举的是最多的选几个的时候,当最多的确定的时候我们贪心的
	{                           //想肯定是每一种糖果都选这个最大值的情况下分子价值最大 
		xx = i;
		for (int j = 0; j < val[i].size(); j++)
		{
			yy += val[i][j];//这个yy就代替了前缀和(当然我们也可将val改成一维从而变成前缀和, 
		}                   // //因为他保留了前几次的值
		val[i].clear();
		if (yy * x > y * xx)//这里用乘法来减小精度的问题,用x,y来记录最大值即可
			x = xx, y = yy;
	}
	int gcdd = gcd(y, x);
	cout << y / gcdd << '/' << x / gcdd << endl;
}
signed main()
{
	Ysanqian;
	int T;
	T = 1;
	cin >> T;
	while (T--)
		solve();
	return 0;
}

将val改成一维前缀和数组:(其实都一样,就改了一丢丢)

#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e5 + 1000, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int gcd(int a, int b)
{
	return b ? gcd(b, a % b) : a;
}
int n, m;
vector<int> g[N];
int sum[N];
int l[N];
bool cmp(int a, int b)
{
	return a > b;
}
void solve()
{
	cin >> n >> m;
	vector<int> val(n+1);
	for (int i = 1; i <= m; i++)
		cin >> l[i]; 
	for (int i = 1; i <= n; i++)
	{
		int a, b;
		cin >> a >> b;
		g[b].pb(a); 
	}
	for (int i = 1; i <= m; i++) 
	{
		sort(g[i].begin(), g[i].end(), cmp);
		for (int j = 0; j < g[i].size(); j++) 
		{
			val[max(l[i], j + 1)]+=(g[i][j]); 
		}
		g[i].clear();
	}
	for(int i=1;i<=n;i++)
		val[i]+=val[i-1];
	int y = 0, x = 1, yy = 0, xx = 0;
	for (int i = 1; i <= n; i++)
	{                           
		xx = i;
		yy=val[i];
		if (yy * x > y * xx)
			x = xx, y = yy;
	}
	int gcdd = gcd(y, x);
	cout << y / gcdd << '/' << x / gcdd << endl;
}
signed main()
{
	Ysanqian;
	int T;
	T = 1;
	cin >> T;
	while (T--)
		solve();
	return 0;
}

C - Line-line Intersection

 题意:每一组就是给你n条直线的上的两个点,让你求这些直线的交点,两条重叠的直线也算有交点,

思路:我们想什么时候才有交点,分为两种情况 1: 斜率不同,2: 斜率相同,但截距不同

那么无交点的情况就有一种,1: 斜率相同且截距不同,

由此我们可以知道我们开两个map一个4元存截距,另一个三元存斜率即可,且可以覆盖斜率不存在的情况

对于我们读入这一条直线来说,我们假设前面的先与其都交点,但是实际肯定不是,那余实际差什么呢,差的无非就是与其无交点的直线呗,所以我们减去与其无交点的情况,我们仔细想想,无交点的情况就只有上面一种情况,然而我们并没有直接的这个数据,我们可以减去与其斜率相同的

斜率相同的有两种情况1: k相同,截距相同,2:k相同,截距不相同,我们减去了这两种情况

,实际只需减去对答案无贡献的2,故我们还要讲1加回来即可

至于xx*b-yy*a==截距*xx我们不需要除以xx以免精度不准确,用到这个的时候,只有k相同,截距相同的时候,当k相同的时候,xx,yy都是最简的,所以k相同,xx一定相同,所以直接保存截距*xx即可

#include <bitsdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 2e5 + 10, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int n;
int a,b,c,d;
int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}
struct node
{
	int a,b,c,d;
}pos[N];
int fun(int x)
{
	int ans=1;
	for(int i=1;i<=x;i++)
	ans*=i;
	return ans/2;
}
void solve()
{
  map<pair<PII,int>,int>mp;//四元,yy,xx,c 分别为y2-y1,x2-x1,和截距
  map<PII,int>g;//三元保存yy,xx,  yy就是斜率k
  cin>>n;
  int ans=0;
   for(int i=1;i<=n;i++)
  {
 	cin>>a>>b>>c>>d;
 	int xx=c-a;
 	int yy=d-b;
 	xx=xx/gcd(xx,yy);
	yy=yy/gcd(xx,yy);
	//cout<<xx<<' '<<yy<<endl;
	ans+=(i-1+mp[{{yy,xx},xx*b-yy*a}]-g[{yy,xx}]);//i-1为假设与前面的直线都相交,不相交只有一种情况,就是k相同,且截距不同,我
	    g[{yy,xx}]++;	                     //我们减去k相同的情况(1.k相同截距不同,2.k相同截距相同),可见我们减去这两种
		mp[{{yy,xx},xx*b-yy*a}]++;           //情况是多减去了,对答案有贡献的情况2,故要加回来
  }
  cout<<ans<<endl;
}
signed main()
{
	Ysanqian;
	int T;
	// T = 1;
	cin >> T;
	while (T--)
		solve();
	return 0;
}

E - Minimum Spanning Tree

 题意:就是给你一个图(G),让其变化为其线图(LG),转化规则就是边变为点,两点距离位原来边的边权之和,让我们求(LG)的最小生成数,

思路:我们从原图(G)入手,管察原图每个点对答案的贡献,那么我们画图观察发现对于每个点,其对答案的贡献就是将与他相连的边的和再加上选择一个最小的*(degree-2),对于每一个点都一样,我们遍遍历即可

  

(字太丑了,没办法了。。。。)

 

#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e6 + 10, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
struct edge
{
	int v, w;
	bool operator<(const edge &other) const
	{
		return w < other.w;
	}
};
vector<edge> g[N];
int n;
void solve()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		g[i].clear();
	for (int i = 1; i < n; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		g[u].pb({v, w});
		g[v].pb({u, w});
	}
	int ans = 0;
	for (int i = 1; i <= n; i++)
	{
		sort(g[i].begin(), g[i].end());
		int minn = inf;
		int degree = g[i].size();
		for (int j = 0; j < degree; j++)
		{
			ans += g[i][j].w;
			minn = min(minn, g[i][j].w);
		}
		ans += minn * (degree - 2);
	}
	cout << (int)ans << endl;
}
signed main()
{
	Ysanqian;
	int T;
	// T=1;
	cin >> T;
	while (T--)
		solve();
	return 0;
}

G - Radar Scanner

 题意:给你n个方形的左下角,以及右上角坐标,问是否存在一点(x,y)使得让它到所有矩形的总路程最小

思路:两维独立,先考虑一维,x轴。

对于一个x轴上的区间[ l , r ],让其移动到x的代价位( |l-x| +|r-x|+|r-l| )/2

除以 2 以及减去 | r − l | 的部分与 x 无关,只需要最小化

∑(|l − x| + |r − x|),当x取l,r的中点时最小

对于二维情况我们存入所有的点,然后排序找到终点,带入公式即可

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxx = 1e6 + 100;
ll x[maxx], y[maxx];
int n, t;
int main()
{
	ios::sync_with_stdio(0);
	cin >> t;
	while (t--)
	{
		cin >> n;
		ll ans = 0;
		ll x1, x2, y1, y2;
		for (int i = 0; i < n; i++)
		{

			cin >> x1 >> y1 >> x2 >> y2;
			ans -= y2 - y1 + x2 - x1; // 先将总的线段长度减去
			x[i] = x1;				  // 记录点
			y[i] = y1;
			x[i + n] = x2;
			y[i + n] = y2;
		}
		sort(x, x + 2 * n); // 排序,
		sort(y, y + 2 * n);
		ll xx = x[n - 1], yy = y[n - 1]; // 找中位数
		for (int i = 0; i < n * 2; i++)
		{ // 看与中位数的距离
			ans += abs(x[i] - xx) + abs(y[i] - yy);
		}
		printf("%lld\n", ans / 2);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32学习笔记(十三)丨USART通用同步/异步收发器(串口外设的基本使用丨串口发送数据、串口发送+接收数据)

本篇文章包含的内容 一、STM32的USART外设1.1 STM32的USAER外设简介1.2 USART外设的结构和工作原理1.3 串口通信数据帧1.4 起始位侦测和USART的噪声判断机制1.5 波特率发生器 二、串口发送和接收数据包2.1 HEX数据包2.2 文本数据包2.3 固定包长HEX数据包接收2.4 可变包长文本数…

chrome edge svg转png

chrome edge svg转png 生成SVG blockdiag Live Preview 导出png 截图&#xff1a; 左上角截取屏幕截图

零售EDI:True Value EDI 需求分析

True Value 是一家享有盛誉的卖场&#xff0c;经营范围广泛&#xff1a;包括家居用品、工具、园艺用品等。据悉&#xff0c;True Value 已将 EDI 纳入其供应商评级中。 True Value 将 EDI 作为对其供应商的一项要求&#xff0c;这意味着如果你希望与 True Value 建立合作关系&a…

uniapp 小程序 联想地址搜索

效果图&#xff1a; qqmap-wx-jssdk.js下载 <template><view class"items"><view class"items-text">地址&#xff08;必填&#xff09;</view><input type"text" placeholder"搜索地址" maxlength&quo…

SQL-每日一题【585.2016年的投资】

题目 Insurance 表&#xff1a; 请你编写一个 SQL 查询&#xff0c;报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和&#xff1a; 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。他所在的城市必须与其他投保人都不同&#…

Revit中如何添加剖面?快速实现剖面图

一、Revit中如何添加剖面&#xff1f; 除了标高绘制所得到的楼层平面视图和立面视图之外&#xff0c;还可以添加剖面视图&#xff0c;这样可以得到任意位置一个竖向的剖切面&#xff0c;例如在楼梯细节处理中&#xff0c;楼梯处于建筑物内部&#xff0c;立面也看不到整个楼梯的…

pdf怎么翻译?有这个工具就够了

pdf怎么翻译&#xff1f;PDF文档一直是我们日常生活和工作中不可避免的一部分。但是&#xff0c;当我们需要翻译PDF文件时&#xff0c;我们往往会感到无助&#xff0c;因为PDF文档不能像其他文本文件一样直接复制和粘贴。那么今天就给大家介绍一款可以帮助我们进行PDF翻译的工具…

Pytorch框架中各文件的作用

新人在接触Pytorch以及深度学习等领域时&#xff0c;面对一个开源的代码可能无从下手&#xff0c;一个Pytorch框架相对比较负责&#xff0c;文件也多&#xff0c;其中的逻辑不免让初学者感到不知所措&#xff0c;下面大致梳理一下Pytorch各文件夹的作用和逻辑&#xff0c;其中的…

基于 Orbit 的云原生应用交付基础原则与良好实践

本文作者&#xff1a;何文强——腾讯云 CODING 高级架构师。 负责 CODING DevOps产品解决方案架构设计和技术产品布道以及 CODING 云原生技术研究与落地实践。在多个技术大会担任演讲嘉宾&#xff0c;腾讯云 CODING DevOps 课程认证出品人&#xff0c;腾讯云云原生训练营核心初…

上市公司Git分支管理规范

Git分支管理策略 主分支Master 首先&#xff0c;代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本&#xff0c;都在这个主分支上发布。 Git主分支的名字&#xff0c;默认叫做Master。它是自动建立的&#xff0c;版本库初始化以后&#xff0c;默认就是在主…

ASEMI快恢复二极管MUR20100CT尺寸, MUR20100CT体积

编辑-Z MUR20100CT参数描述&#xff1a; 型号&#xff1a;MUR20100CT 最大峰值反向电压(VRRM)&#xff1a;1000V 最大RMS电压(VRMS)&#xff1a;700V 最大直流阻断电压(VDC)&#xff1a;1000V 平均整流正向电流(IF)&#xff1a;20A 非重复峰值浪涌电流(IFSM)&#xff1a…

Revit中墙体的问题,门窗洞口及柱断梁墙

一、如何同时开两道相邻墙的门窗洞口 做外墙装饰的时候&#xff0c;我们很经常为了方便、简洁在已经绘制好的墙体外围再绘制一面墙体&#xff0c;并且添加上材质作为外饰面&#xff0c;提高工作效率;但是遇到有门窗洞口的墙体时&#xff0c;外饰面墙体却没办法直接被门窗剪切&a…

LeetCode142.环形链表II

142.环形链表II 目录 142.环形链表II一、哈希表二、双指针 一、哈希表 和141题.判断链表是否有环类似&#xff0c;区别在于141题只要求判断链表中是否有环&#xff0c;该题则要求我们返回入环节点 一个非常直观的思路&#xff1a;遍历链表中的每个节点&#xff0c;并将它们记…

【论文】基于GANs的图像文字擦除 ——2010.EraseNet: End-to-End Text Removal in the Wild(已开源)

pytorch官方代码&#xff1a;https://github.com/lcy0604/EraseNet 论文&#xff1a;2010.EraseNet: End-to-End Text Removal in the Wild 网盘提取码&#xff1a;0719 一、图片文字去除效果 图10 SCUT-EnsText 真实数据集的去除 第一列原图带文字、第二列为去除后的标签&a…

【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

目录 前言 1.冒泡排序 1.1冒泡排序动图 1.2冒泡排序源代码 1.3冒泡排序的特性总结 2.快速排序&#x1f451; 2.1hoare版本实现思想 排序前 排序中 排序后 2.2hoare版本快排源代码 2.3分析先走 情况1&#x1f947; 情况2&#x1f948; 前言 交换类排序两个常见的排…

7月31日起,这类产品将禁止在亚马逊美国站销售!

亚马逊美国站发布公告称由于口腔胶带&#xff08;睡眠胶带&#xff09;在睡觉时存在潜在危险&#xff0c;出于对消费者的安全考虑&#xff0c;任何睡眠胶带产品的listing将在亚马逊商店下架&#xff0c;以下是公告内容&#xff1a; 自2023年7月31日起&#xff0c;口腔胶带&…

Docker 应用容器引擎

Docker 应用容器引擎 一、Docker是什么二、Docker安装和查看1、docker安装2、docker版本信息查看3、docker信息查看 三、镜像操作四、容器操作1、容器创建2、创建并启动容器3、容器的进入4、复制5、容器的导入和导出6、删除容器 一、Docker是什么 是一个开源的应用容器引擎&…

Java遍历集合方法分析(实现原理、算法性能、适用场合)

Java遍历集合方法分析&#xff08;实现原理、算法性能、适用场合&#xff09; 概述 java语言中&#xff0c;提供了一套数据集合框架&#xff0c;其中定义了一些诸如List、Set等抽象数据类型&#xff0c;每个抽象数据类型的各个具体实现&#xff0c;底层又采用了不同的实现方式…

56 # 实现 pipe 方法进行拷贝

pipe 是异步的&#xff0c;可以实现读一点写一点&#xff0c;管道的优势&#xff1a;不会淹没可用内存&#xff0c;但是在导入的过程中无法获取到内容 const fs require("fs"); const path require("path");fs.createReadStream(path.resolve(__dirname…

电脑记事本笔记误删如何找回?恢复删除的笔记方法

电脑上有很多好用的记事本软件。以Windows电脑为例&#xff0c;比较经典的有txt记事本&#xff0c;每个记事本可以单独的文件形式保存&#xff0c;误删某个记事本文件后可通过回收站找回&#xff0c;还原恢复。而如果正编辑笔记的时候误删了笔记&#xff0c;还未保存的情况下可…