首页 > 其他分享 >2024/7/2 T1

2024/7/2 T1

时间:2024-07-02 20:08:33浏览次数:1  
标签:int len T1 2024 110 集合 now define

题意:

分析:

记 \(S_{i}\) 表示目前第 \(i\) 个集合里的元素个数。

集合之间互不区分,强制钦定必须满足 \(S_{i} \le S_{i+1}(i<k)\)。

经搜索发现,这样的状态数量最多约为 \(1.8 \times 10^5\)。

极差可以这样处理:将 \(a\) 排序,\(S_{i}\) 第一次加入某个元素 \(x\),则贡献加上 \(-x\);\(S_{i}\) 被 \(y\) 填满,则贡献加上 \(+y\)。

这样看起来可以 dp,但还有一个问题:如何处理每个集合的元素必须互不相同呢?

可以强制要求所有相同的元素必须以一个固定的顺序加入,使得其在不同的集合,可以从大到小加或从小到大加(元素个数)。这里采用前者。

f[S][j]表示(从小往大填)已经填了i(∑S[i])个数,第i个数在加入后它目前在的集合的大小为j
当我们填入a[i+1]时,如果a[i+1]=a[i],则需要保证a[i+1]填入的集合的大小小于j即可 

然后做完了!

时隔 \(7\) 个月,以前的我看不懂题解,但现在我 AC 了,牛不牛。

#include<bits/stdc++.h>
#define N 110
#define int long long
#define base 131
using namespace std;
bool s1;

int n, k, len;
int a[N], now[N];

vector<int>z[110];
int S[200005][110];
int tot;

unordered_map<int, int>id;

void dfs(int x, int lst) {
	if(x > k) {
		tot++;
		int g = 0;
		int num = 0;
		for(int i = 1; i <= k; i++) {
			S[tot][i] = now[i];
			g += now[i];
			num = num * base + now[i];
		}
		id[num] = tot;
		z[g].push_back(tot);
		//cout << tot << endl;
		return;
	}
	for(int i = lst; i <= len; i++) {
		now[x] = i;
		dfs(x + 1, i);
	}
}

int f[200005][110];
//f[S][j]表示(从小往大填)已经填了i(∑S[i])个数,第i个数在加入后它目前在的集合的大小为j
//当我们填入a[i+1]时,如果a[i+1]=a[i],则需要保证a[i+1]填入的集合的大小小于j即可 

void upd(int &x, int y) {
	x = min(x, y);	
}

bool s2;
signed main() {
	//freopen("diyiti06.in", "r", stdin);
	//ios::sync_with_stdio(0);
	//cin.tie(0); cout.tie(0);
	//cerr << (&s1 - &s2) / 1024 / 1024 << " MB\n";
	cin >> n >> k;
	len = n / k;
	for(int i = 1; i <= n; i++) cin >> a[i];
	/*if(k == n) {
		cout << 0;
		return 0;
	}*/ 
	sort(a + 1, a + n + 1);
	dfs(1, 0);
	//cerr << "e";
	for(int S = 1; S <= tot; S++)
	for(int j = 0; j <= len; j++) f[S][j] = 1e18;
	
	/*for(int s = 1; s <= tot; s++) {
		cout << "S " << s << " : ";
		for(int j = 1; j <= len; j++) cout << S[s][j] << " ";
		cout << endl;
	}
	
	for(int i = 1; i <= n; i++) {
		cout << i << " : ";
		for(auto x : z[i]) cout << x << " ";
		cout << endl; 
	}*/
	
	f[2][1] = -a[1];
	if(len == 1) f[2][1] = 0;
	for(int i = 1; i < n; i++) {
		for(auto s : z[i]) {
			//if(i == 1) cout << "look : " << s << endl;
			for(int x = 1; x <= k; x++) {
				if(S[s][x]) {
					//if(i == 1) cout << "ppp : " << x << endl;
					int j = S[s][x]; //第i个数加入的是第x个集合 
					if(f[s][j] == 1e18) continue;
					
					//printf("f[%lld][%lld] = %lld\n", s, j, f[s][j]);
					
					//考虑填入a[i+1]
					for(int y = 1; y <= k; y++) { //将a[i+1]放入第y个集合里 
						if(a[i] == a[i + 1] && S[s][y] >= j) break;
						for(int h = 1; h <= k; h++) now[h] = S[s][h];
						now[y]++;
						if(now[y] > len) continue;
						int J = now[y], derta = 0;
						if(J == len) derta += a[i + 1];
						if(J == 1) derta -= a[i + 1];
						sort(now + 1, now + k + 1);
						int num = 0;
						for(int h = 1; h <= k; h++) 
							num = num * base + now[h];
						int Nxt_S = id[num];
						upd(f[Nxt_S][J], f[s][j] + derta);	
					}
					
				}	
				
			}
		}
	}
	
	if(f[tot][len] == 1e18) cout << -1;
	else cout << f[tot][len];
	return 0;
}

/*
6 3
1 1 1 1 2 5
*/


标签:int,len,T1,2024,110,集合,now,define
From: https://www.cnblogs.com/xcs123/p/18280470

相关文章

  • 【SPIE独立出版】第三届智能机械与人机交互技术学术会议(IHCIT 2024,7月27)
    由北京航空航天大学指导,北京航空航天大学自动化科学与电气工程学院主办,AEIC学术交流中心承办的第三届智能机械与人机交互技术学术会议(IHCIT2024)将定于2024年7月27日于中国杭州召开。大会面向基础与前沿、学科与产业,旨在将“人工智能”、“智能系统”和“人机交互”等学......
  • 【IEEE出版】第六届电子与通信,网络与计算机技术国际学术会议(ECNCT 2024,7月19-21)
    第六届电子与通信,网络与计算机技术国际学术会议(ECNCT2024)将于2024年7月19日-21日在中国·广州举办,为期三天。会议由广东工业大学自动化学院主办,会议将安排主旨报告,口头报告以及海报展示,主题包括通信技术及应用,计算机工程,网络工程和应用技术,电子和电气工程等。本......
  • 【嵌入式DIY实例】- LCD ST7735显示DHT11传感器数据
    LCDST7735显示DHT11传感器数据文章目录LCDST7735显示DHT11传感器数据1、硬件准备与接线2、代码实现本文介绍如何将ESP8266NodeMCU板(ESP-12E)与DHT11(RHT01)数字湿度和温度传感器连接。NodeMCU从DHT11传感器读取温度(以°C为单位)和湿度(以r......
  • 人才趋势2024  中国大陆 跨越期望鸿沟
    近日,全球知名的招聘咨询机构MichaelPage发布了《人才趋势2024|中国大陆跨越期望鸿沟》报告。该报告深刻剖析了当前职场中雇主与雇员之间存在的期望差异,以及这种差异对招聘和人才保留策略的影响。报告通过深入分析2500名中国大陆员工的观点,探讨了灵活办公、多元公平与包......
  • 2024年6月普通二本大学毕业的抉择——就业、读研、考公,该选哪条路?
    2024年6月普通二本大学毕业的抉择——就业、读研、考公,该选哪条路?我认为最终决策应基于个人兴趣、能力、职业规划及家庭经济状况等多方面因素综合考虑。无论选择哪条路,都需要付出努力和坚持,重要的是明确自己的目标和方向。1.就业优势:即时经济独立:毕业后直接就业可以立即获......
  • 2024年公司加密软件排行榜(企业加密软件推荐)
    在信息时代,企业数据安全至关重要,防止数据泄露和未授权访问是首要任务之一。以下是2024年备受好评的企业加密软件排行榜:固信加密软件https://www.gooxion.com/1.固信加密软件固信加密软件是新一代企业级加密解决方案,采用先进的加密技术,并提供全面的数据保护功......
  • 复旦大学2023--2024学年第二学期(23级)高等代数II期末考试第七大题解答
    七、(10分) 设$V$是$n$阶实矩阵全体构成的实线性空间, $A$是$n$阶正定实对称阵.对任意的$X,Y\inV$,定义二元函数$(X,Y)=\mathrm{tr}(XAY')$.(1)求证:$(-,-)$是$V$上的一个内积.(2)在上述内积下,$V$成为一个欧氏空间. 设$P,Q\inV$,$V$上的线性算子$......
  • C#基础2024.07.02
    目录1.变量的作用域有哪些?2.成员变量和静态变量的区别?成员变量(实例变量)静态变量(类变量)3.利用递归,写个文件目录遍历,打印出文件名、扩展名、文件大小4.简述访问修饰符有几种,各有什么不同?(1)public(2)private(3)protected(5)internal(6)protectedinternal5.重点比较public、pr......
  • 逐月信息学 2024 提高组 #5
    \(\color{black}\texttt{A.党同伐异}\)题目描述有\(N\)个候选人,每个候选人都有一个不同的政治倾向\(c_i\),进行\(N-1\)次选举。每轮选举中,所有未被淘汰的候选人给另一个没被淘汰的候选人。每一个候选人会将票投给\(c_i\)与自己差的绝对值最大的候选人。如果有多个这样的......
  • 2024年华为OD机试真题-分披萨-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:“吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数扇形小块。但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小......