Island
Friday, January 1, 2021, 08:00 PM
ถมดินรวมเกาะ(island)
อธิบายโจทย์
เรามีพื้นที่ทั้งหมด N พื้นที่ และต้องการรวมเกาะให้เหลือ K เกาะ
เฉลย
ให้เรารับค่า island[i] ถ้า island[i] มีค่าน้อยกว่า 0 ให้บวกค่าใน sum ถ้า island[i] มากกว่า 0 ให้ นำค่า sum มาใส่ที่
dp[island_cnt]
Source Code(C++) :
#include<iostream>
#include<vector>
using namespace std;
int main (void){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k,sum=0,island_cnt=0;
cin >> n >> k;
vector<int>island(n),dp;
for(int i=0;i<n;++i){
cin >> island[i];
if(island[i] < 0){
sum += abs(island[i]) + 1;
}
else{
dp.push_back(sum);
sum = 0;
island_cnt++; //ใช้นับจำนวนเกาะที่มี
}
}
return 0;
}
แต่ว่าถ้าทำตามโต้ดด้านบนจะเกิดบัคขึ้น เพราะจะนับจำนวนเกาะผิดพลาดเพราะถ้า island[i] > 0 และอยู่ติดกับพื้นดินจะ
ไม่นับเป็นเกาะ เราจึงเพิ่ม mark เข้าไป
Source Code(C++) :
#include<iostream>
#include<vector>
using namespace std;
int main (void){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k,sum=0,island_cnt=0;
cin >> n >> k;
bool mark = false;
vector<int>island(n),dp;
for(int i=0;i<n;++i){
cin >> island[i];
if(island[i] < 0){
sum += abs(island[i]) + 1;
mark = true;
}
if(island[i] < 0 and mark == true){
dp.push_back(sum);
sum = 0;
island_cnt++;
mark = false;
}
}
return 0;
}
ต่อมาในส่วนของการหาจุดที่ควรถมสามารถใช้ Greedy Algorithm ได้โดยการเรียงเลขในอาร์เรย์ dp
Source Code(C++) :
#include<iostream>
#include<vector>
using namespace std;
int main (void){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k,sum=0,island_cnt=0;
cin >> n >> k;
bool mark = false;
vector<int>island(n),dp;
for(int i=0;i<n;++i){
cin >> island[i];
if(island[i] < 0){
sum += abs(island[i]) + 1;
mark = true;
}
if(island[i] < 0 and mark == true){
dp.push_back(sum);
sum = 0;
island_cnt++;
mark = false;
}
}
dp.push_back(sum);
sort(dp.begin(),dp.end());
return 0;
}
จากนั้นเราจะบวกที่ที่ต้องถมจนกว่าจะเหลือเกาะเท่ากับ k เกาะ
Source Code(C++) :
#include<iostream>
#include<vector>
using namespace std;
int main (void){
ios::sync_with_stdio(0);
cin.tie(0);
int n,k,sum=0,island_cnt=0;
cin >> n >> k;
bool mark = false;
vector<int>island(n),dp;
for(int i=0;i<n;++i){
cin >> island[i];
if(island[i] < 0){
sum += abs(island[i]) + 1;
mark = true;
}
if(island[i] < 0 and mark == true){
dp.push_back(sum);
sum = 0;
island_cnt++;
mark = false;
}
}
dp.push_back(sum);
sort(dp.begin(),dp.end());
int ans = 0;
for(int i=0;i<island_cnt-k;++i){
ans += dp[i];
}
cout << ans << endl;
return 0;
}
author