C++で作成できる座標ペアの数を求めるプログラム
問題概要
2次元平面上に与えられた2n個の座標点を考えます。これらの座標は、coordAとcoordBという2つの配列に分けられており、各座標は整数のペアで表されます。ここで、coordAから1点、coordBから1点を選んでペアを作ることを考えます。ペアを作成できるのは、coordA側の点のx座標がcoordB側の点のx座標より小さく、かつcoordA側の点のy座標がcoordB側の点のy座標より小さい場合のみです。さらに、1つの点が複数のペアに属することはできないものとします。このとき、作成できるペアの総数を求めます。
例として、入力が n = 3、coordsA = {{1, 3}, {2, 4}, {4, 3}}、coordsB = {{2, 2}, {4, 2}, {0, 2}} の場合、出力は 1 になります。このとき作成できる唯一のペアは、(1, 3) と (0, 2) の組み合わせです。
アルゴリズム
この問題を解くために、以下の手順に従います。
- サイズ100の配列chkを宣言し、すべて0で初期化します(各点の使用済みを示すフラグです)。
- 配列coordAをソートします。
- 配列coordBをソートします。
- ペア数を数える変数kを0で初期化します。
- i を n-1 から 0 まで減らしながらループします。
j を 0 から n-1 まで増やしながらループします。
chk[j] が 0 であり、かつ座標の大小条件を満たす場合は、chk[j] を 1 に設定し、k を1増やして内側のループを抜けます。 - 最後に k を出力します。
実装例
理解を深めるために、以下の実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
#define N 100
void solve(int n, vector<pair<int,int>> coordA, vector<pair<int,int>>coordB){
int i, j, k;
int chk[100] = {0};
sort(coordA.begin(),coordA.end());
sort(coordB.begin(),coordB.end());
k = 0;
for(i = n - 1; i >= 0; i--) {
for(j = 0; j < n; j++) {
if(chk[j] == 0 && coordA[i].first < coordB[j].second && coordA[i].second < coordB[j].first) {
chk[j] = 1;
k++;
break;
}
}
}
cout<< k;
}
int main() {
int n = 3;
vector<pair<int,int>> coordsA = {{1, 3}, {2, 4}, {4, 3}};
vector<pair<int,int>> coordsB = {{2, 2}, {4, 2}, {0, 2}};
solve(n, coordsA, coordsB);
return 0;
}入力
3, {{1, 3}, {2, 4}, {4, 3}}, {{2, 2}, {4, 2}, {0, 2}}出力
1
-
グリッド内で照らされているセルの数を求めるC++プログラム
問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb
-
【C++】グラフの連結性を保ちながら辺を削除し、スコアの最大削減量を求める方法
問題概要 n 個の頂点と m 本の辺からなる重み付き無向グラフを考えます。グラフの「スコア」は、含まれるすべての辺の重みの総和として定義されます。辺の重みは負になることもあり、そのような辺を取り除くとかえってスコアが増えてしまいます。 ここで求めたいのは、グラフを連結状態に保ったまま不要な辺を削除してスコアを最小化し、「スコアを最大でどれだけ減らせるか」を計算することです。 グラフは配列 edges として与えられ、各要素は {weight, {vertex1, vertex2}}(重みと両端の頂点)という形式で表されます。 入力例と出力 たとえば n = 5、m = 6、edges = {