반응형

 

 

 

일단 기다리는 시간을 최소화해야하므로 입력받은 수를 벡터에 저장 후, sort STL을 이용해 정렬한 다음

반복문을 사용해 각 벡터의 값인 v[i]의 값을 계속 축적해가면서 출력할 변수인 ans에 더해줬다

 

입력이 3 1 4 3 2 인 경우

1 2 3 3 4로 정렬을 하고 더하게 되면

1

1+2

1+2+3

1+2+3+3

1+2+3+3+4

 

의 값이 필요하므로

벡터 v의 i번째의 값을 더할때는 i-1까지의 덧셈이 모두 필요하므로

v[i]까지의 합을 더해주는 변수 tmp와 이 합들을 모두 더해줄 ans 변수를 사용했다

처음에는 변수 하나만으로 표현하려고 해서 계속 벡터의 값을 다 더하기만한 13만 찍어냈는데

ans 변수 하나를 추가하니 바로 해결돼버림

 

 

#include <bits/stdc++.h>
using namespace std;

int main() {
	vector<int> v;
	int cnt = 0;
	int tmp=0;
	cin >> cnt;
	for(int i=0; i<cnt; i++){
		cin >> tmp;
		v.push_back(tmp);
	}
	
	tmp=0;
	int ans=0;
	sort(v.begin(), v.end());
	
	for(int i=0; i<cnt; i++){
		tmp+=v[i];
		ans+=tmp;
	}
	cout <<ans;
	
	return 0;
}

 

덧셈부분을 좀더 단순화해본 코드

 

1

1+2

1+2+3

1+2+3+3

1+2+3+3+4

 

v[0]은 총 5번 더하고 v[1]은 4번더하고 ... v[4]는 한번 더해서 반복되는 덧셈 과정을 곱셈으로 바꿔줌

 

#include <bits/stdc++.h>
using namespace std;

int main() {
	vector<int> v;
	int cnt = 0;
	int tmp=0;
	cin >> cnt;
	for(int i=0; i<cnt; i++){
		cin >> tmp;
		v.push_back(tmp);
	}
	int ans=0;
	sort(v.begin(), v.end());
	
	for(int i=0; i<cnt; i++){
		ans += (cnt-i)*v[i];
	}
	cout <<ans;
	
	return 0;
}

 

 

출처 : www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

반응형

+ Recent posts