L1-112 现代战争(分数20)
题目描述
王牌飞行员 佐巴杨 最近迷上了一款游戏,在游戏里他驾驶战斗机,对一座地图进行轰炸,地图由n×m个小方格组成,每个方格有个城市,其价值为w。
佐巴杨很聪明,他知道自己每次要轰炸价值最高的城市,而这个炸弹会将这座城市所在行与列上的城市全部轰炸,每次轰炸,地图会自动更新为(n-1)× (m-1)的地图。佐巴杨会经历k次轰炸。
输入格式
第一行给出n,m( \(2\) \(\le\) \(n,m\) \(\le\) \(1000\) ) ,k( k \(<\) min{m,n} )
接着给出n×m的地图。
输出格式
输出最后的地图
解题思路
显然需要一个 row数组 和 col数组 来记录每一行和每一列的情况 ,还需要在每次轰炸前找到价值最大的城市且要清楚他的行号与列号 ,并改变bool数组状态;
如果每次遍历,太慢,如果转换为一维数组,下标映射太麻烦 ; 那不如用一个 结构体 ,因为结构体可以使得价值与行号,列号绑定。
用结构体储存val,col,row;并排序,轰炸时,令bool[struct[i].row(col)] = true;
最后
遍历初始地图,如果这一行或者这一列被标记 , 不输出,否则输出。
ac✅️代码
#include<iostream>
#include<algorithm>
using namespace std;
struct M {
int val;
int row;
int col;
bool operator< (const M &s) const {
return val > s.val;
}
} member[1000005];
int mp[1010][1010];
bool r[1010], c[1010];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, t;
if (!(cin >> n >> m >> t)) return 0;
int st = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> mp[i][j];
member[st].val = mp[i][j];
member[st].row = i;
member[st].col = j;
st++;
}
}
sort(member, member + st);
for (int i = 0; i < st; i++) {
if (t == 0) break;
if (!r[member[i].row] && !c[member[i].col]) {
r[member[i].row] = true;
c[member[i].col] = true;
t--;
}
}
for (int i = 0; i < n; i++) {
if (r[i]) continue;
bool first = true;
for (int j = 0; j < m; j++) {
if (c[j]) continue;
if (!first) cout << " ";
cout << mp[i][j];
first = false;
}
cout << endl;
}
return 0;
}
佐巴杨的游戏生活圆满了,但人总要面对生活

浙公网安备 33010602011771号