模拟题,认真读题,多做自然熟练
不过有个特别有意思的点,这题怎么处理这个要求呢?
如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。
我用的是
vec[i][j - 1] + 1 == vec[i][j]
vec[i][j] = idx;
这就会出现一个特别奇特的事,比如vec[1][1],正常应该是1,但由于vec[1][0]是0,这就导致vec[1][1]成了2,后续也一样,出现每个点多1的情况,输出的时候-1就可以,但还是很有意思的
避免这种情况那就对0列做个初始化,其他的照旧
#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
#define ld long double
using namespace std;
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
const int NC = 2e3 + 10;
char ches[NC][NC];
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int a[N], b[N], n, m;
int vec[NC][NC];
void solve() {
cin >> n;
int mx = 0;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
mx = max(mx, a[i]);
for (int j = 1; j <= a[i] * 10; ++j)
vec[i][j] = -1;
}
for(int i = 1;i <= n;++i)
vec[i][0] = INT_MAX;
int idx = 1;
for (int j = 1; j <= mx * 10; ++j) {
for (int i = 1; i <= n; ++i) {
if (vec[i][j] == -1) {
//if(i == 1 && j == 1)cout <<"idx = " << idx << endl;
vec[i][j] = idx;
//cout << "vec[1][1] = " << vec[1][1] << endl;
idx++;
if (vec[i][j - 1] + 1 == vec[i][j]) {
vec[i][j] = idx;
idx++;
}
}
}
}
//cout << "vec[1][1] = " << vec[1][1] << endl;
for (int i = 1; i <= n; ++i) {
cout << "#" << i << endl;
for (int j = 1; j <= a[i]; ++j) {
for (int k = 1; k < 10; ++k) {
cout << vec[i][(j - 1) * 10 + k] << " ";
}
cout << vec[i][j * 10]<< endl;
}
}
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}