๐Ÿ•๏ธ PS (BOJ)/Two Pointer

[BOJ][C++] ๋ฐฑ์ค€ 10025๋ฒˆ: ๊ฒŒ์œผ๋ฅธ ๋ฐฑ๊ณฐ (Silver III)

์„ ๋‹ฌ 2022. 10. 18. 15:48
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/10025

 

10025๋ฒˆ: ๊ฒŒ์œผ๋ฅธ ๋ฐฑ๊ณฐ

์ฒซ ์ค„์— ์ •์ˆ˜ N๊ณผ K๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N์งธ ์ค„๊นŒ์ง€, ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ๊ฐ ์–‘๋™์ด์˜ ์–ผ์Œ์˜ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” gi์™€ ์–‘๋™์ด์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” xi๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

๋ฌธ์ œ

๋”์šด ์—ฌ๋ฆ„๋‚  ๋™๋ฌผ์›์˜ ๋ฐฑ๊ณฐ ์•จ๋ฒ„ํŠธ๋Š” ๋„ˆ๋ฌด ๋”์›Œ์„œ ๊ผผ์ง๋„ ํ•˜๊ธฐ ์‹ซ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ์‚ฌ์œก์‚ฌ๋“ค์ด ์•จ๋ฒ„ํŠธ์˜ ๋”์œ„๋ฅผ ์‹ํžˆ๊ธฐ ์œ„ํ•ด ์–ผ์Œ์ด ๋‹ด๊ธด ์–‘๋™์ด๋“ค์„ ๊ฐ€์ ธ๋‹ค ์ฃผ์—ˆ๋‹ค. ์•จ๋ฒ„ํŠธ๊ฐ€ ๊ฐ€์žฅ ์ ์€ ๊ฑฐ๋ฆฌ๋งŒ ์›€์ง์ด๊ณ ๋„ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์–ผ์Œ์œผ๋กœ ๋”์œ„๋ฅผ ์‹ํž ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์ž.

์šฐ๋ฆฌ ์•ˆ์€ 1์ฐจ์› ๋ฐฐ์—ด๋กœ ์ƒ๊ฐํ•˜๋ฉฐ, ์ด N(1 ≤ N ≤ 100000)๊ฐœ์˜ ์–ผ์Œ ์–‘๋™์ด๋“ค์ด xi(0 ≤ xi ≤ 1,000,000)์ขŒํ‘œ๋งˆ๋‹ค ๋†“์—ฌ ์žˆ๊ณ  ๊ฐ ์–‘๋™์ด ์•ˆ์—๋Š” gi(1 ≤ gi ≤ 10,000)์”ฉ์˜ ์–ผ์Œ์ด ๋“ค์–ด ์žˆ๋‹ค. ์ผ๋‹จ ์•จ๋ฒ„ํŠธ๊ฐ€ ์ž๋ฆฌ๋ฅผ ์žก์œผ๋ฉด ๊ทธ๋กœ๋ถ€ํ„ฐ ์ขŒ์šฐ๋กœ K(1 ≤ K ≤ 2,000,000) ๋งŒํผ ๋–จ์–ด์ง„ ์–‘๋™์ด๊นŒ์ง€ ๋‹ฟ์„ ์ˆ˜ ์žˆ๋‹ค. ์•จ๋ฒ„ํŠธ๋Š” ์–‘๋™์ด๊ฐ€ ๋†“์—ฌ ์žˆ๋Š” ์ž๋ฆฌ์—๋„ ์ž๋ฆฌ์žก์„ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์–ผ์Œ ์–‘๋™์ด์˜ ์œ„์น˜๋Š” ๋‹ค๋ฅด๋‹ค.

์•จ๋ฒ„ํŠธ๊ฐ€ ์ตœ์ ์˜ ์ž๋ฆฌ๋ฅผ ๊ณจ๋ž์„ ๋•Œ ์–ผ์Œ์˜ ํ•ฉ์„ ๊ตฌํ•˜์‹œ์˜ค. ์ฆ‰, ์–ผ์Œ๋“ค์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ ์ค„์— ์ •์ˆ˜ N๊ณผ K๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N์งธ ์ค„๊นŒ์ง€, ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ๊ฐ ์–‘๋™์ด์˜ ์–ผ์Œ์˜ ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” gi์™€ ์–‘๋™์ด์˜ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” xi๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์•จ๋ฒ„ํŠธ๊ฐ€ ํƒํ•œ ์ตœ์  ์œ„์น˜๋กœ๋ถ€ํ„ฐ K๋งŒํผ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ ๋‚ด์— ์žˆ๋Š” ์–ผ์Œ๋“ค์˜ ํ•ฉ(์ตœ๋Œ“๊ฐ’)์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

// ํ’€์ด : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;

const int INF = 4000001;

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	// input
	int n,k, g,x;
	cin >> n >> k;
	vector<int>v(INF, 0);
	for(int i=0; i<n; i++) {
	    cin >> g >> x;
	    v[x] = g;
	}
	
	// solution
	long long cur=0, ans=0;
	int left=0, right=0;
	for(; right<=2*k; right++) {
	    cur += v[right];
	}

	while(right<INF) {
	    ans = max(cur, ans);
	    cur -= v[left];
	    cur += v[right];
	    left++;
	    right++;
	}
	
	cout << ans;

    return 0;
}

2025.04.22

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

const int SIZE = 1000000;

int maxIce(int k, int end_point, vector<int>&position) {
    int section = 2*k + 1;
    int section_ice = 0;
    for(int i=0; i<section; i++){
        if(i > end_point)
            break;
        
        section_ice += position[i];
    }
    
    int ans = section_ice;
    for(int i=section; i<=end_point; i++) {
        section_ice -= position[i-section];
        section_ice += position[i];
        ans = max(ans, section_ice);
    }
    
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int n, k;
    cin >> n >> k;
    vector<int> position(SIZE+1, 0);
    int g, x, end_point=0;
    while(n--) {
        cin >> g >> x;
        position[x] = g;
        end_point = max(end_point, x);
    }
    
    cout << maxIce(k, end_point, position);
    
    return 0;
}

/*
 */

2021.08.08 ?

๋ฐ˜์‘ํ˜•