목록STL (9)
블로그 옮겼습니다
처음엔1234567ans = 0; map mp; if(mp[어떤답] == 0) mp[어떤 답] = 1, ans++; Colored by Color Scriptercs이렇게 했었는데 굳이 이렇게 할 필요없이 그냥 set에 넣고나서 마지막에 set.size() 를 하면 쉽게알수있다..
1번째 방법12345678stringstream ss1(S);for(string str1; getline(ss1,str1,' ');){ stringstream ss2(str1); vector in; for(string str2; getline(ss2,str2,',');) in.push_back(stoi(str2)); int a,b,c; tie(a,b,c) = {in[0],in[1],in[2]};}Colored by Color Scriptercs 2번쨰 방법1234567// "a,b,c d,e,f h,i,j" 와 같은 형태의 문자열 파싱하기 stringstream ss1(S);for(string str1; getline(ss1,str1,' ');){ int a,b,c; sscanf(str1.c_str(),..
문제링크 모든 자연수를 \(1+2+4+.....+2^{k-1}+r\) 로 분해할 수가 있는데M개의 수를 이 방식대로 분해하여 분해된 요소들을 모두 모아 정렬한 결과인 sequence를 A라고 해보자. \(1\leq{N}\leq{10^5}\)\(1\leq{a_i}\leq{10^{12}}\) sequence의 크기 N과 N개의 elements 로 이루어진 A의 원소들 ai 가 입력으로 들어온다. 이 A를 다시 분해하기 전의 원래의 수로 복원하려고하는데 복원하는 방법은 여러가지가 있을 것이다.복원의 결과로 나온 수가 K개일 때 K가 될 수 있는 수는 여러가지가있을 것이다. 이 때 이 가능한 K들을오름차순으로 모두 출력하는게 문제의 질문이다. 우선 k+1 개의 수를 \(1+2+4+.....+2^{k-1}\) 의..
예를 들어vector v[3] 이 있고v[0] = {2, 5, 9, 3}v[1] = {0, 7, 4}v[2] = {1, 6, 8} 일때, 각각의 벡터를 정렬한 뒤 벡터들은 사전순으로 정렬 하려면그냥 sort(v, v+3) 을 하면 알아서 한꺼번에 정렬됨
문제 링크 이 문제는 일단 모빌이 주어진다. 모빌이란, 막대기가 있고 막대기의 양쪽에 모빌또는 물체가 달린다.모빌의 깊이는 최대 16이다. 이때 각 모든 막대기의 양옆에 달린 덩어리 두개가 균형을 이루게 만들기 위해최소 몇개의 물체나 무게를 변경해야 하는지 구하는 문제이다.예를들어,이런 모빌이 있다면 7을 3으로 만들면 모든 막대기에서 균형이 맞게되므로 답은 1이다.3을 7로, 6을 14로 바꿔도 균형을 이루지만 최소의 개수가 아니기 때문에 답이 아니다. 그러면 결국 전체 모빌의 무게를 x로 만들려고 할때 각 덩어리의 무게는 다음과 같이 만들어 주어야 한다. 그렇다면 x를 정해주고 재귀적으로 따라 내려가면서 각각의 덩어리에 대해 되어야 하는 무게와 현재 물체의 무게가같다면 바꾸어 주어야하는 것이기 때문에..
\(1\leq{N}\leq{24}\)\(10^6\leq{P[i]}\leq{4\cdot{10^7}}(0\leq{i}\lt{N})\)맨션의 개수 N이 주어지고, 각 맨션의 가격 P[i] 가 주어진다. 두 사람이 이혼을 하는데 맨션을 나눠 가지려 한다.각 맨션은 남자가 갖거나, 여자가 갖거나, 둘 다 안갖고 부동산에 팔거나 셋중 하나이다.이 때 남자가 갖게되는 맨션들의 가격의 합과 여자가 갖게되는 맨션들의 가격의 합이 무조건 같도록맨션을 나누고 싶다. 대신 가능한한 부동산에 파는 맨션의 가격을 최소화하고 싶다. 이 때 부동산에 팔아야하는맨션들의 가격의 합을 구하는 문제이다. 일단 naive 하게 각 맨션이 여자가 가짐,남자가 가짐,부동산에 팜 셋중 하나니까 3가지의 경우의 수가 있고N개의 맨션이 있으므로 O(..
https://community.topcoder.com/stat?c=problem_statement&pm=11634 \(1\leq{N}\leq{40}\)o와 x로 이루어진길이가 N인 문자열 S가 입력으로 들어올 때, 이 문자열에 포함된 각각의 문자들에 대해서 s1문자열 맨뒤에 붙일것인지s2문자열 맨뒤에 붙일것인지를 결정한다. 그리고 최종적으로 s1과 s2가 같게 만드는 방법의 수를 모두 구하는 문제이다.참고로 각 문자들은 구분할 수가 있기 때문에 최종 문자열이 같더라도 S상에서의 위치로 변환해봤을 때다르다면 방법이 다른것이므로 둘 다 셀 것이다. 우선 naive 하게 생각하여 모든 경우의 수를 세면서 두 문자열을 비교하여 같다면 더해주는 방식이 있을 것이다.이 방법은 우선 각각의 문자가 어떤 문자열에 들..
https://www.acmicpc.net/problem/1044 \(2\leq{N}\leq{36}\) (N은 짝수) N을 입력받고, 10^15 이하인 자연수를 N개씩 두줄 입력받는다. N명의 사람은 1번팀 또는 2번팀에 들어간다. 각각의 사람이 어떤 팀에 들어갈 때 증가하는 팀의 전력이 주어진다.1번팀과 2번팀가 같은 수의 팀원을 가지며 두 팀의 전력차가 최소가 되도록 팀을 배정할 때 각각의 사람이 어떤팀에들어가게 되는지를 구하는 문제다.(만약 두 팀의 전력차가 같은 답이 여러개 있을 경우 사람들의 팀을 순서대로 나열한sequence 가 사전순으로 앞서는 것을 출력. 예를 들어 2 1 1 2 와 2 1 2 1 이 있으면 2 1 1 2 를 출력) 일단 naive 하게 생각해 보면 N이 최대 36이기 때문..
전까지는 unordered_map 를 선언하고 이 안에 없으면 새로 추가하고 있으면 지나가는 식으로 했는데 코드 줄도 길어지고뭔가 지저분해졌지만 어쩔수 없이 썼었는데 이럴 필요가 없었다.. 보다 깔끔한 방법 두가지가 있다. 첫번째는 unique 라는 함수를 사용하는 것이다.정렬되어있는 벡터의 시작과 끝 iterator 를 인자로 주면 모든 수들을 한번씩만 써서 정렬한 sequence 를 맨앞에 오도록순서를 재배치 하고 그 끝 iterator 를 반환 한다고 한다. 그래서 이렇게한다.12345678910111213#include using namespace std; int main() { vector v({1,1,1,1,2,2,2,3,3,4,4,5,6,7,7,7,7,8,8,9,9,9}); sort(v.be..