题目
错误思路
调了两个小时,还WA了两个点,只有15分。
#include<bits/stdc++.h>
const int maxn = 1e2 + 5;
using namespace std;
int c[maxn], a[maxn][10 * maxn], id[10 * maxn];
bool vis[maxn];
int main()
{
int N; cin >> N;
for (int i = 1; i <= N; i++)cin >> c[i];
int curid = 0, lastmin = 0;
while (1) {
int num = 0, curmin = 1e9, cnt = 0;
for (int i = 1; i <= N; i++)if (vis[i] == false)curmin = min(curmin, c[i]), num++;
if (curmin == 1e9)break;
if (num == 1) {
for (int i = 1; i <= N; i++) {
if (vis[i] == false) {
for (int j = 2; j <= (curmin - lastmin) * 20; j += 2) {
a[i][++id[i]] = curid + j;
}
}
}
break;
}
for (int i = 1; i <= N; i++) {
if (vis[i] == false) {
for (int j = 1; j <= (curmin - lastmin)*num * 10; j += num) {
a[i][++id[i]] = curid + cnt + j;
}
cnt++;
}
}
for (int i = 1; i <= N; i++)if (c[i] == curmin)vis[i] = true;
curid += (curmin - lastmin)*num * 10;
lastmin = curmin;
}
for (int i = 1; i <= N; i++) {
cout << "#" << i << endl;
for (int j = 1; j <= c[i] * 10; j++) {
cout << a[i][j];
if (j % 10 == 0)cout << endl;
else cout << " ";
}
}
return 0;
}
正解
转换视角,海阔天空~
浪费了两个小时,其实是自己看问题的方式太死板。
只要换一个合理的视点看问题,一切都会迎刃而解。
一个故事,六个视点,编织出多种旋律;
一道题目,两股思维,分化出不同答案。
我们只需要把输出的答案阵列转置,行变列,列变行,再逐个赋予标号,并记录先前标记的队员与现在的是否属于同一学校即可。
以下是20分AC代码。
#include<bits/stdc++.h>
const int maxn = 1e2 + 5;
using namespace std;
int c[maxn], a[10 * maxn][maxn];
int main()
{
int N; cin >> N;
int maxcol = 0, num = 0, pre = 0;
for (int i = 1; i <= N; i++)cin >> c[i], maxcol = max(maxcol, c[i]);
for (int i = 1; i <= maxcol * 10; i++) {
for (int j = 1; j <= N; j++) {
if (i > c[j] * 10)continue;
if (pre == j)++num;
a[i][j] = ++num;
pre = j;
}
}
for (int i = 1; i <= N; i++) {
cout << "#" << i << endl;
for (int j = 1; j <= c[i] * 10; j++) {
cout << a[j][i];
if (j % 10 == 0)cout << endl;
else cout << " ";
}
}
return 0;
}
本文分享了一道编程题目,讲述了错误的解题思路以及如何转换视角找到正确答案。作者最初尝试直接操作数组,但遇到困难,后来意识到需要将输出矩阵转置,从而简化问题。通过转置视角,将行变为列,成功实现了20分的AC代码。
4427

被折叠的 条评论
为什么被折叠?



