주식거래시 최대 이익 남기는 알고리즘
#include<iostream>
using namespace std;
int m[1000001];
int main() {
int T;
cin >> T;
int n;
int max;
for (int i = 0; i < T; i++) {
long long sum = 0;
cin >> n;
for (int j = 0; j < n; j++) {
cin >> m[j];//금액 입력 받음
}
max = m[n - 1];//max값을 마지막날 금액으로 설정
//지금까지 구매한 가격 중 제일 비싼 가격
for (int k = n - 2; k >= 0; k--) {
//뒤에서 두 번째 날 부터 시작해서
if (m[k] > max)
{
max = m[k];//현재 도는 값이 마지막날(max)값보다 크면 max변경
}
else {//현재보다 max가 크면
sum += max - m[k];
//k일에 주식을 팔 때 얻을 수 있는 이익을 구함
//이익+=현재 최고가 max에서 k일의 가격을 뺌
}
}
cout << "#" << i + 1 << " " << sum << "\n";
}
}
#include<iostream>
#include<vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int T;
cin >> T;
for (int i = 1; i <= T; i++) {
int N;
cin >> N;
vector<int>A;
A.resize(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
int max = A[N - 1];
long long sum = 0;
for (int i = N - 2; i >= 0; i--) {
if (A[i] > max) {
max = A[i];
}
else {
sum += max - A[i];
}
}
cout <<"#"<<i<<" "<<sum << "\n";
}
}
코드 출처: https://ehdtn1219.tistory.com/45
행렬의 행, 열, 대각선 별 합 구하기
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>row(100, 0);
vector<int>col(100, 0);
vector<int>cross(2, 0);
vector<vector<int>>A(100, vector<int>(100));
int main() {
int T = 10;
int N;
for (int test_case = 1; test_case <= T; test_case++) {
cin >> N;
//행렬 입력받기
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
cin >> A[i][j];
}
}
//행 합 구하기
for (int i = 0; i < 100; i++) {
int rowsum = 0;
for (int j = 0; j < 100; j++) {
rowsum += A[i][j];
}
row[i] = rowsum;
}
//열 합 구하기
for (int i = 0; i < 100; i++) {
int colsum = 0;
for (int j = 0; j < 100; j++) {
colsum += A[j][i];
}
col[i] = colsum;
}
//오른쪽 대각선 구하기
int rightcross = 0;
for (int i = 0; i < 100; i++) {
rightcross += A[i][i];
}
cross[0] = rightcross;
//왼쪽 대각선 구하기
int leftcross = 0;
int addrow = 0;
int addcol = 99;
for (int i = 0; i < 100; i++) {
leftcross += A[addrow][addcol];
addrow++;
addcol--;
}
cross[1] = leftcross;
//행, 열, 대각선합 벡터를 오름차순 정렬하기
sort(col.begin(), col.end());
sort(row.begin(), row.end());
sort(cross.begin(), cross.end());
int colmax = col[99];
int rowmax = row[99];
int crossmax = cross[1];
//제일 큰 값 구하기
int ans = max(colmax, max(rowmax, crossmax));
cout << "#" << test_case << " ";
cout << ans << "\n";
//cout << "행: " << colmax << " 열: " << rowmax << " 대각선: " << crossmax << "\n";
}
}