แนวคิด
โจทย์ข้อนี้เป็นแนว Greedy Algorithm
เราจะนิยามตัวแปร เป็นคะแนนที่ได้จากการทำภารกิจที่ ดังนั้น (โจทย์ได้กำหนดไว้)
หลังจากที่เราได้ค่า ตั้งแต่ภารกิจที่ ถึง แล้วเราจะทำการ Sort ค่า ทั้งหมดจากมากไปน้อย โดยจะสมมติว่าได้เป็น ออกมาแล้วจะพิจารณาคะแนนรวมที่มากที่สุดหลังหักค่าปรับแล้วจาก โดยที่
Time Complexity:
ทำไมถึงสามารถใช้วิธีนี้ได้
จุดสังเกตคือ ถ้าจำนวนภารกิจที่เราไม่ได้ทำนั้นเท่ากัน การเลือกภารกิจที่จะทำนั้นไม่ได้ส่งผลต่อการเปลี่ยนแปลงของค่าปรับ หมายความว่าถ้าเราทำเลือกภารกิจจำนวน ภารกิจเราจะต้องเสียค่าปรับเท่ากับ เสมอ
ดังนั้นหากต้องการเลือกภารกิจ P อย่าง เราควรจะเลือกภารกิจที่ได้คะแนนมากสุด P ภารกิจก่อนเสมอ
ซึ่งถ้าเรา Sort จากมากไปน้อยแล้วเลือกตั้งแต่ตัวที่ ถึงตัวที่ จะการันตีว่าเราจะได้ผลรวมของคะแนนที่มากที่สุดก่อนหักค่าปรับจากการทำภารกิจ ภารกิจ
โค้ดตัวอย่างในภาษา C++
#include <bits/stdc++.h> using namespace std; vector<long long> c; int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { long long a, b; scanf("%lld %lld", &a, &b); c.push_back(b - 2 * a); } sort(c.begin(), c.end(), greater<long long>()); long long ans = -((long long)n * (long long)n), notdo = n, now_sum = 0; for (auto i : c) { now_sum += i; notdo--; ans = max(ans, now_sum - (notdo * notdo)); } printf("%lld", ans); }