#define IO ios::sync_with_stdio(0); cin.tie(0); #define endl '\n' typedeflonglong ls; typedefunsignedlonglong uls; //const int N = 1010; constint mx = 1LL<<16;
uls n; uls a[mx + 10];
boolisprime(uls x){ if (x < 2) returnfalse; if (x == 2) returntrue; if (x % 2 == 0) returnfalse; for (uls i = 3; i * i <= x; i += 2) if (x % i == 0) returnfalse; returntrue; }
voidsol(){ cin >> n; for (int i = 1; i <= mx; i++) a[i] = i; int cnt = 0; int max_ed = -1, max_p = -1; for (int i = 1; i <= 32; i++){ cnt++; uls sum = 0; for (int i = 1; i <= mx; i++){ sum += a[i]; a[i] *= i; if (sum == n){ max_ed = i, max_p = cnt; break; } if (sum > n) break; } } if (max_ed == -1) cout << "Impossible for " << n << '.' << endl; else{ for (int i = 1; i <= max_ed; i++){ cout << i << "^" << max_p; if (i < max_ed) cout << "+"; } cout << endl; } }
intmain(){ IO sol(); return0; }
L1-112 现代战争
在最新的《命运召唤:现代战争》中,你要扮演 B 国的一名战斗机飞行员,前往轰炸 A 国的高价值建筑。A 国的建筑群可视为一个由 n×m 个小方格组成的地图,每个小方格中有一幢建筑,并且你已经知道了所有建筑的价值。作为一名优秀的战斗机飞行员,你打算实施如下轰炸方式:每次选择当前所有还存在的建筑里价值最高的一幢投下炸弹,这个炸弹会将该建筑所在的一整行和一整列都炸平。随后系统将行列中被炸平的建筑移除,剩下的地块合并成一个 (n−1)×(m−1) 的新地图。例如对原始地图
176295384
进行一次轰炸后,更新后的地图为
1634
请你编写程序,输出你轰炸了 k 幢建筑后的地图。注意:游戏纯属虚构,如有雷同纯属巧合。
输入格式
输入第一行给出三个正整数 n、m 和 k(2≤n,m≤1000,且 k<min{n,m}),依次对应地图中建筑的行数、列数,以及轰炸步数。随后 n 行,每行 m 个整数,为地图中对应建筑的价值。题目保证所有元素在 [−230,230] 区间内,且互不相等。同一行数字间以空格分隔。
int n, m, k, x; int a[N][N]; vector<tuple<int, int, int> > v; bool row[N], col[N];
voidsol(){ cin >> n >> m >> k; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++){ cin >> x; a[i][j] = x; v.push_back({x, i, j}); } sort(v.begin(), v.end(), greater<>()); int ed = m, cnt = 0; for (int i = 0; i < (int)v.size(); i++){ auto [x, j, t] = v[i]; if (row[j] || col[t]) continue; row[j] = col[t] = true; ed--; if (++cnt == k) break; } for (int i = 1; i <= n; i++){ int c = 0; for (int j = 1; j <= m; j++) if (!row[i] && !col[j]){ cout << a[i][j]; if (++c < ed) cout << ' '; else cout << endl; } } }