lower_boundについて
#include <iostream>
#include <string>
using namespace std;
int a[5] = {10, 20, 20, 40, 60};
int main()
{
cout << lower_bound(a, a + 5, 0) - a << endl; # 0
cout << lower_bound(a, a + 5, 20) - a << endl; # 1
cout << lower_bound(a, a + 5, 100) - a << endl; # 5
cout << lower_bound(a, a + 5, 40) - a << endl; # 3
cout << lower_bound(a, a + 5, 50) - a << endl; # 4
}
AtCoder Typical Contest 001 参加
A: 深さ優先探索 - AtCoder Typical Contest 001 | AtCoder
B: Union Find - AtCoder Typical Contest 001 | AtCoder
C: 高速フーリエ変換 - AtCoder Typical Contest 001 | AtCoder
Cの高速フーリエ変換だけ分からなかった。。高速フーリエ変換ちゃんと勉強しよっと。。
A: 深さ優先探索
int H, W;
string mp[505] = {};
bool used[505][505] = {};
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
void solve(int x, int y) {
used[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (0 <= nx && nx < H && 0 <= ny && ny < W) {
if (!used[nx][ny]) {
solve(nx, ny);
}
}
}
}
int main() {
cin >> H >> W;
for (int i = 0; i < H; i++) {
cin >> mp[i];
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (mp[i][j] == '#') {
used[i][j] = 1;
}
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (mp[i][j] == 's') {
solve(i, j);
}
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (mp[i][j] == 'g') {
if (used[i][j]) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
}
}
return 0;
}
B: Union Find
struct UF {
vector<int> parent, rank;
UF(int n) {
parent.resize(n); rank.resize(n);
for (int i = 0; i < n; i++) { parent[i] = i; rank[i] = 1; }
}
bool same(int x, int y) {
return (find_root(x) == find_root(y));
}
int find_root(int x){
if (parent[x] != x) parent[x] = find_root(parent[x]);
return parent[x];
}
void connect(int x, int y){
int rx = find_root(x), ry = find_root(y);
if (rx == ry) return;
if (rank[rx] > rank[ry]) { parent[ry] = rx; rank[rx] += rank[ry]; }
if (rank[rx] <= rank[ry]) { parent[rx] = ry; rank[ry] += rank[rx]; }
}
};
int main() {
int N, Q;
cin >> N >> Q;
UF uf(N);
for (int i = 0; i < Q; i++) {
int p, a, b;
cin >> p >> a >> b;
if (p) {
if (uf.same(a, b)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
} else {
uf.connect(a, b);
}
}
return 0;
}
yukicoder no.221/222/223 参加
初yukicoder参加。
1,2はただの実装。3は分からなくてそのまま時間切れとなってしまった。
犯罪都市
int main() {
int N; cin >> N;
N *= 100;
double total = 1000*1000;
double normal = total - N;
double arrested = N * 0.99 + normal * 0.01;
cout << normal / arrested << endl;
return 0;
}
引き算と足し算
字句解析のように実装したが、yukicoderはLL使えるようなのでそっちでやりゃよかった...。こういう問題初めてなので謎にC++で頑張ってしまった。
int main() {
string s;
cin >> s;
string x="", y="";
int i = 0;
if (s[i] == '-'){
x+='-';
i++;
}
if (s[i] == '+'){
i++;
}
while (s[i] != '-' && s[i] != '+'){
x += s[i];
i++;
}
char op = s[i];
i++;
if (s[i] == '-'){
y+='-';
i++;
}
if (s[i] == '+') {
i++;
}
while (i < s.size()) {
y += s[i];
i++;
}
stringstream ss(x);
int xi; ss >> xi;
stringstream ss2(y);
int yi; ss2 >> yi;
if (op == '-') cout << xi + yi << endl;
else if (op == '+') cout << xi - yi << endl;
return 0;
}
Combinatorial - Longest Increasing Subsequence
最長増加部分列 | 動的計画法 | Aizu Online Judge
int a[1000*100+5] = {};
int main() {
int n;
cin >> n;
fill(a, a + 1000*100+5, 1000*1000*1000*2);
for (int i = 0; i < n; i++) {
int t;
cin >> t;
*(lower_bound(a, a + 1000*100+5, t)) = t;
}
cout << lower_bound(a, a + 1000*100+5, 1000*1000*1000*2) - a << endl;
return 0;
}
Combinatorial - Knapsack Problem
Knapsack Problem | Aizu Online Judge
Combinatorial - 0-1 Knapsack Problem - アルゴリズムのメモ帳 とほぼ同じ問題。
続けて解いたので、ちょっとずるして上で解いたものを再利用した。
int main() {
int N, W; cin >> N >> W;
int v[105], w[105];
for (int i = 0; i < N; i++) cin >> v[i] >> w[i];
int dp[105][10005];
memset(dp, -1, sizeof(dp));
int res = 0;
dp[0][0] = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j <= W; j++) {
int k = j - w[i];
if (k >= 0 && dp[i][k] >= 0) {
dp[i + 1][j] = max(dp[i][j], dp[i][k] + v[i]);
}
if (k >= 0 && dp[i + 1][k] >= 0) {
dp[i + 1][j] = max(dp[i + 1][j], dp[i + 1][k] + v[i]);
}
dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
res = max(res, dp[i + 1][j]);
}
}
printf("%d\n", res);
return 0;
}