グリディの解題
4192 ワード
😊 冒険者ギルド #include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int result = 0; // 총 그룹의 수
int count = 0; // 현재 그룹에 포함된 모험가의 수
for (int i = 0; i < n; i++) { // 공포도를 낮은 것부터 하나씩 확인하며
count += 1; // 현재 그룹에 해당 모험가를 포함시키기
if (count >= arr[i]) { // 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
result += 1; // 총 그룹의 수 증가시키기
count = 0; // 현재 그룹에 포함된 모험가의 수 초기화
}
}
cout << result << '\n'; // 총 그룹의 수 출력
}
😊 乗算または加算 #include <bits/stdc++.h>
using namespace std;
string str;
int main(void) {
cin >> str;
// 첫 번째 문자를 숫자로 변경한 값을 대입
long long result = str[0] - '0';
for (int i = 1; i < str.size(); i++) {
// 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행
int num = str[i] - '0';
if (num <= 1 || result <= 1) {
result += num;
}
else {
result *= num;
}
}
cout << result << '\n';
}
😊 反転文字列 #include <bits/stdc++.h>
using namespace std;
string str;
int count0 = 0; // 전부 0으로 바꾸는 경우
int count1 = 0; // 전부 1로 바꾸는 경우
int main(void) {
cin >> str;
// 첫 번째 원소에 대해서 처리
if (str[0] == '1') {
count0 += 1;
}
else {
count1 += 1;
}
// 두 번째 원소부터 모든 원소를 확인하며
for (int i = 0; i < str.size() - 1; i++) {
if (str[i] != str[i + 1]) {
// 다음 수에서 1로 바뀌는 경우
if (str[i + 1] == '1') count0 += 1;
// 다음 수에서 0으로 바뀌는 경우
else count1 += 1;
}
}
cout << min(count0, count1) << '\n';
}
😊 作成できない金額
コードの説明
たとえば、1、2、3、5元の単位を持つ場合は、まず1、2、3元
1 = 1
2 = 2
3 = 3
4 = 1+3
5 = 2+3
6 = 1+2+3
つまり1+2+3=6元でもできます.
ここから5元以上入ったら.
1+5 , 2+5 , 3+5, ... , (ブロック問題に類似)1+2+3+5=11元.
でも1,2,3,8元の単位硬貨があれば
1+2+3=6以降は7元は作れません.すなわち,target(単位)を増やし続け,持つ単位より小さくすれば最適解を求めることができる.#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int target = 1;
for (int i = 0; i < n; i++) {
// 만들 수 없는 금액을 찾았을 때 반복 종료
if (target < arr[i]) break;
target += arr[i];
}
// 만들 수 없는 금액 출력
cout << target << '\n';
}
😊 ボウリングを選ぶ
コードの説明
A、B二人がいるときは、Aを基準にしてcaseを分けます.
重さが1のボウリングが1つ、重さが2のボウリングが2つ、重さが3のボウリングが2つあるとしたら
(組み合わせなら、義手を考えてみます)
Case 1)Aが重量1の球を選ぶとき->
(A選択質量1の個数)1*4(B選択質量の場合)
Case 2)Aが重量2のボールを選ぶとき->
(A選択質量2の個数)2 2(B選択質量の場合)
ここで、2 3ではないのは、組み合わせにより算出された重量1を選択した場合を除きます.
case3 )
2*0=0種
全部で8種類あります.#include <bits/stdc++.h>
using namespace std;
int n, m;
// 1부터 10까지의 무게를 담을 수 있는 배열
int arr[11];
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x] += 1;
}
int result = 0;
// 1부터 m까지의 각 무게에 대하여 처리
for (int i = 1; i <= m; i++) {
n -= arr[i]; // 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
result += arr[i] * n; // B가 선택하는 경우의 수와 곱해주기
}
cout << result << '\n';
}
😊 無知な食いしん坊生活
priority queueナビゲーションの使用
=>再学習
Reference
この問題について(グリディの解題), 我々は、より多くの情報をここで見つけました
https://velog.io/@trevor522/그리디-문제풀이
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int result = 0; // 총 그룹의 수
int count = 0; // 현재 그룹에 포함된 모험가의 수
for (int i = 0; i < n; i++) { // 공포도를 낮은 것부터 하나씩 확인하며
count += 1; // 현재 그룹에 해당 모험가를 포함시키기
if (count >= arr[i]) { // 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
result += 1; // 총 그룹의 수 증가시키기
count = 0; // 현재 그룹에 포함된 모험가의 수 초기화
}
}
cout << result << '\n'; // 총 그룹의 수 출력
}
#include <bits/stdc++.h>
using namespace std;
string str;
int main(void) {
cin >> str;
// 첫 번째 문자를 숫자로 변경한 값을 대입
long long result = str[0] - '0';
for (int i = 1; i < str.size(); i++) {
// 두 수 중에서 하나라도 '0' 혹은 '1'인 경우, 곱하기보다는 더하기 수행
int num = str[i] - '0';
if (num <= 1 || result <= 1) {
result += num;
}
else {
result *= num;
}
}
cout << result << '\n';
}
😊 反転文字列 #include <bits/stdc++.h>
using namespace std;
string str;
int count0 = 0; // 전부 0으로 바꾸는 경우
int count1 = 0; // 전부 1로 바꾸는 경우
int main(void) {
cin >> str;
// 첫 번째 원소에 대해서 처리
if (str[0] == '1') {
count0 += 1;
}
else {
count1 += 1;
}
// 두 번째 원소부터 모든 원소를 확인하며
for (int i = 0; i < str.size() - 1; i++) {
if (str[i] != str[i + 1]) {
// 다음 수에서 1로 바뀌는 경우
if (str[i + 1] == '1') count0 += 1;
// 다음 수에서 0으로 바뀌는 경우
else count1 += 1;
}
}
cout << min(count0, count1) << '\n';
}
😊 作成できない金額
コードの説明
たとえば、1、2、3、5元の単位を持つ場合は、まず1、2、3元
1 = 1
2 = 2
3 = 3
4 = 1+3
5 = 2+3
6 = 1+2+3
つまり1+2+3=6元でもできます.
ここから5元以上入ったら.
1+5 , 2+5 , 3+5, ... , (ブロック問題に類似)1+2+3+5=11元.
でも1,2,3,8元の単位硬貨があれば
1+2+3=6以降は7元は作れません.すなわち,target(単位)を増やし続け,持つ単位より小さくすれば最適解を求めることができる.#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int target = 1;
for (int i = 0; i < n; i++) {
// 만들 수 없는 금액을 찾았을 때 반복 종료
if (target < arr[i]) break;
target += arr[i];
}
// 만들 수 없는 금액 출력
cout << target << '\n';
}
😊 ボウリングを選ぶ
コードの説明
A、B二人がいるときは、Aを基準にしてcaseを分けます.
重さが1のボウリングが1つ、重さが2のボウリングが2つ、重さが3のボウリングが2つあるとしたら
(組み合わせなら、義手を考えてみます)
Case 1)Aが重量1の球を選ぶとき->
(A選択質量1の個数)1*4(B選択質量の場合)
Case 2)Aが重量2のボールを選ぶとき->
(A選択質量2の個数)2 2(B選択質量の場合)
ここで、2 3ではないのは、組み合わせにより算出された重量1を選択した場合を除きます.
case3 )
2*0=0種
全部で8種類あります.#include <bits/stdc++.h>
using namespace std;
int n, m;
// 1부터 10까지의 무게를 담을 수 있는 배열
int arr[11];
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x] += 1;
}
int result = 0;
// 1부터 m까지의 각 무게에 대하여 처리
for (int i = 1; i <= m; i++) {
n -= arr[i]; // 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
result += arr[i] * n; // B가 선택하는 경우의 수와 곱해주기
}
cout << result << '\n';
}
😊 無知な食いしん坊生活
priority queueナビゲーションの使用
=>再学習
Reference
この問題について(グリディの解題), 我々は、より多くの情報をここで見つけました
https://velog.io/@trevor522/그리디-문제풀이
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <bits/stdc++.h>
using namespace std;
string str;
int count0 = 0; // 전부 0으로 바꾸는 경우
int count1 = 0; // 전부 1로 바꾸는 경우
int main(void) {
cin >> str;
// 첫 번째 원소에 대해서 처리
if (str[0] == '1') {
count0 += 1;
}
else {
count1 += 1;
}
// 두 번째 원소부터 모든 원소를 확인하며
for (int i = 0; i < str.size() - 1; i++) {
if (str[i] != str[i + 1]) {
// 다음 수에서 1로 바뀌는 경우
if (str[i + 1] == '1') count0 += 1;
// 다음 수에서 0으로 바뀌는 경우
else count1 += 1;
}
}
cout << min(count0, count1) << '\n';
}
コードの説明
たとえば、1、2、3、5元の単位を持つ場合は、まず1、2、3元
1 = 1
2 = 2
3 = 3
4 = 1+3
5 = 2+3
6 = 1+2+3
つまり1+2+3=6元でもできます.
ここから5元以上入ったら.
1+5 , 2+5 , 3+5, ... , (ブロック問題に類似)1+2+3+5=11元.
でも1,2,3,8元の単位硬貨があれば
1+2+3=6以降は7元は作れません.すなわち,target(単位)を増やし続け,持つ単位より小さくすれば最適解を求めることができる.
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> arr;
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr.push_back(x);
}
sort(arr.begin(), arr.end());
int target = 1;
for (int i = 0; i < n; i++) {
// 만들 수 없는 금액을 찾았을 때 반복 종료
if (target < arr[i]) break;
target += arr[i];
}
// 만들 수 없는 금액 출력
cout << target << '\n';
}
😊 ボウリングを選ぶ
コードの説明
A、B二人がいるときは、Aを基準にしてcaseを分けます.
重さが1のボウリングが1つ、重さが2のボウリングが2つ、重さが3のボウリングが2つあるとしたら
(組み合わせなら、義手を考えてみます)
Case 1)Aが重量1の球を選ぶとき->
(A選択質量1の個数)1*4(B選択質量の場合)
Case 2)Aが重量2のボールを選ぶとき->
(A選択質量2の個数)2 2(B選択質量の場合)
ここで、2 3ではないのは、組み合わせにより算出された重量1を選択した場合を除きます.
case3 )
2*0=0種
全部で8種類あります.#include <bits/stdc++.h>
using namespace std;
int n, m;
// 1부터 10까지의 무게를 담을 수 있는 배열
int arr[11];
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x] += 1;
}
int result = 0;
// 1부터 m까지의 각 무게에 대하여 처리
for (int i = 1; i <= m; i++) {
n -= arr[i]; // 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
result += arr[i] * n; // B가 선택하는 경우의 수와 곱해주기
}
cout << result << '\n';
}
😊 無知な食いしん坊生活
priority queueナビゲーションの使用
=>再学習
Reference
この問題について(グリディの解題), 我々は、より多くの情報をここで見つけました
https://velog.io/@trevor522/그리디-문제풀이
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <bits/stdc++.h>
using namespace std;
int n, m;
// 1부터 10까지의 무게를 담을 수 있는 배열
int arr[11];
int main(void) {
cin >> n >> m;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
arr[x] += 1;
}
int result = 0;
// 1부터 m까지의 각 무게에 대하여 처리
for (int i = 1; i <= m; i++) {
n -= arr[i]; // 무게가 i인 볼링공의 개수(A가 선택할 수 있는 개수) 제외
result += arr[i] * n; // B가 선택하는 경우의 수와 곱해주기
}
cout << result << '\n';
}
priority queueナビゲーションの使用
=>再学習
Reference
この問題について(グリディの解題), 我々は、より多くの情報をここで見つけました https://velog.io/@trevor522/그리디-문제풀이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol