牛客小白月赛64-C-karashi的生日蛋糕

本文介绍了解决NowCoder竞赛中Karashi的生日蛋糕问题的算法,涉及数组动态规划,找到每行内元素分配的规律并计算上取整或下取整结果。
摘要由CSDN通过智能技术生成

       非常有意思的一道题,大模拟题,就是找规律

基本规律:

这一行内谁能多给

1

        1

        1

                1

                1

                1

按照每列这样的顺序,看谁能多拿,多拿的是上取整,不多拿那就是下取整

一个化简很重要的点:

                出现大于一圈情况的多拿,此时是列长度 i % 行k ,这是实际能多拿的

剩余的就看代码,实现很直观

// Problem: Karashi的生日蛋糕
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/49244/C
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2024-03-14 14:10:56
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int rec[1000005];
void solve() {
	int n, k; cin >> n >> k;
	vector<vector<int>>a(k + 1, vector<int>(n + 1));
	for (int i = 1, x = 1; i <= n; ++i) {
		for (int j = 1; j <= i % k; ++j, ++x) {
			a[(x % k == 0) ? k : (x % k)][i]++;
			rec[i] = max(rec[i], a[(x % k == 0) ? k : (x % k)][i]);
		}
	}
	/*for (int i = 1; i <= k; ++i) {
		for (int j = 1; j <= n; ++j) {
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;*/
	for (int i = 1; i <= k; ++i) {
		for (int j = 1; j <= n; ++j) {	
			if (a[i][j] == rec[j]) {
				cout << (int)ceil(j * 1.0 / k) << " ";
			}
			else {
				cout << j / k << " ";
			}
		}
		cout << endl;
	}
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值