2018天梯赛决赛 L1-1 天梯赛座位分配 (20 分) 题解

本文分享了一道编程题目,讲述了错误的解题思路以及如何转换视角找到正确答案。作者最初尝试直接操作数组,但遇到困难,后来意识到需要将输出矩阵转置,从而简化问题。通过转置视角,将行变为列,成功实现了20分的AC代码。
摘要由CSDN通过智能技术生成

题目

题目链接

错误思路

调了两个小时,还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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keguaiguai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值