티스토리 뷰
아직 문제를 제대로 풀지 못했다.. 답은 맞을 것 같은데(uDebug에서 확인함) TLE때문에 안되니까 꼭 다시풀거다.
코드
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef vector<int> vi;
typedef vector<int>::iterator vit;
map<int,int> towers
int main() {
int n, allowed,m,t,commonArea,temp,sum,idx,max,cases=0,people;
int sign = 1;
int total = 0;
int j;
vector<int> answer;
/*
n:number of towers planned
allowed:number of towers allowed
*/
while (cin >> n >> allowed) {
if(cases)cout << endl;
memset(towers, 0, sizeof(int) * 1024 * 1024);
//input part
if (n == 0 && allowed == 0) break;
for (int i = 0; i < n; i++) cin >> towers[(1 << i)];
cin >> m;
for (int i = 0; i < m; i++) {
cin >> t;
if (t >= 3) {
commonArea = 0;
vi input_element; //교집합의 idx를 모아놓은 vector
input_element.reserve(30);
for (int j = 0; j < t; j++) {
cin >> temp;
input_element.push_back((1 << (temp - 1)));
commonArea |= (1 << (temp - 1));
}
cin >> people;
towers[commonArea] = people;
//교집합 후처리
for (int num_of_el = 2; num_of_el <=t-1; num_of_el++) {
vi onesAndZeros;
onesAndZeros.reserve(30);
for (int i = 0; i < t - num_of_el; i++) onesAndZeros.push_back(0);
for (int i = 0; i < num_of_el; i++) onesAndZeros.push_back(1);
int ind;
do {
ind = 0;
for (int j = 0; j < t; j++) {
ind |= (input_element[j] * onesAndZeros[j]);
}
towers[ind] += people;
} while (next_permutation(onesAndZeros.begin(), onesAndZeros.end()));
}
}
else {
commonArea = 0;
for (int j = 0; j < t; j++) {
cin >> temp;
commonArea |= (1 << (temp - 1));
}
cin >> people; //number of people
towers[commonArea] += people;
//DEBUGING
// cout << "towers[" << commonArea << "]에 " << people << "를 넣었음" << endl;
}
}
//outputpart
sum = 0, max = 0;
//Using next_permutation function, making subset
int bits[30];
for (int i = 0; i < allowed; i++) bits[i] = 1;
for (int i = allowed; i < n; i++) bits[i] = 0;
do { //nCr가지 조합들 전부 포함됨
//bits.
vi indexes;
indexes.reserve(30);
int s = 0;
for (int i = 0; i < n;i++) {
if (bits[i] == 1) indexes.push_back((1 << (s)));
++s;
}
int r = allowed;
//함수파트 이식
//r==allowed
sign = 1;
total = 0;
for (int numOfOnes = 1; numOfOnes <= r; ++numOfOnes) {
vi elementBit;
elementBit.reserve(30);
for (int i = 0; i < r - numOfOnes; i++) {
elementBit.push_back(0);
}
for (int i = 0; i < numOfOnes; i++) {
elementBit.push_back(1);
}
do {
idx = 0; j = 0;
for (vit it = elementBit.begin(); it != elementBit.end(); ++it) {
idx |= indexes[j] * (*it);
++j;
}
total += sign * towers[idx];
} while (next_permutation(elementBit.begin(), elementBit.end()));
sign *= -1;
}
sum = total;
if (sum > max) {
max = sum;
answer = indexes;
}
} while (prev_permutation(bits, bits+n));
//max를 출력
cout << "Case Number " << ++cases << endl;
cout << "Number of Customers: " << max << endl;
cout << "Locations recommended: ";
for (int k = 0; k < allowed; ++k) cout << log2(answer[k]) + 1 << " ";
}
return 0;
}
'기초 알고리즘 문제 풀이' 카테고리의 다른 글
41. UVa-10567 //Binary Search (0) | 2020.03.04 |
---|---|
40. UVa-10576 Y2K Accounting Bug (0) | 2020.03.03 |
38. UVa-624 CD //Easy recursive Backtracking (0) | 2020.03.02 |
37. UVa-11236 Grocery Store //complex multi loop searching (2) | 2020.02.28 |
36. UVa-10487 Closest Sums //nlogn solution (0) | 2020.02.28 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 영상구조
- 이미지
- 인덱스 이미지
- 밑바닥부터 시작하는 딥러닝
- Logistic Regression
- 사진구조
- 이미지처리
- rnn
- 컴퓨터 과학
- CS
- CNN
- 연속 신호
- 컴퓨터과학
- gradient descent
- 영상처리
- 머신 러닝
- 신경망
- ML
- 매트랩
- 매트랩 함수
- NLP
- 자연어 처리
- 머신러닝
- 이산 신호
- 신호 및 시스템
- 순환 신경망
- RGB이미지
- 딥러닝
- Neural Network
- Andrew ng
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함