非常有意思的一道题,大模拟题,就是找规律
基本规律:
这一行内谁能多给
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;
}