洛谷P1034 矩形覆蓋

来源:https://www.cnblogs.com/jiupinzhimaguan/archive/2020/03/10/12452766.html
-Advertisement-
Play Games

P1034 矩形覆蓋 題目描述 在平面上有n個點(n include include include include using namespace std; int read(){ int x=0,f=1;char ch=getchar(); while(ch'9'){if(ch==' ')f= ...


P1034 矩形覆蓋

題目描述

在平面上有n個點(n<=50),每個點用一對整數坐標表示。例如:當n=4時,4個點的坐標分另為:p1(1,1),p2(2,2),p3(3,6),P4(0,7),見圖一。

這些點可以用 k 個矩形(1<=k<=4)全部覆蓋,矩形的邊平行於坐標軸。當 k=2 時,可用如圖二的兩個矩形 sl,s2 覆蓋,s1,s2 面積和為 4。問題是當 n 個點坐標和 k 給出後,怎樣才能使得覆蓋所有點的 k 個矩形的面積之和為最小呢。約定:覆蓋一個點的矩形面積為 0;覆蓋平行於坐標軸直線上點的矩形面積也為0。各個矩形必須完全分開(邊線與頂點也都不能重合)。

輸入格式

n k
xl y1
x2 y2
… …
xn yn
(0<=xi,yi<=500)

輸出格式

輸出至屏幕。格式為:
一個整數,即滿足條件的最小的矩形面積之和。

輸入輸出樣例

輸入

4 2
1 1
2 2
3 6
0 7

輸出

4

分析

主要是搜索
這題剪枝方法似乎多種多樣。
下麵將要展示代碼的做法:
將讀入的坐標按x和y從小到大排序,然後搜索將連續的i個點分在一起,期間判斷問題是否可行,以及進行各種小優化。
Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct point{
    int x,y;
}a[60];
int cmp(point a,point b){
    if(a.x==b.x)return a.y<b.y;
    return a.x<b.x;
}
struct block{
    int x1,y1,x2,y2;
}b[5];
int n,k;
int ans=1e9;
void DFS(int pos,int cnt,int smm){
    if(pos>n){
        ans=min(ans,smm);
        return;
    }
    if(cnt>k)return;
    int i,j;
    b[cnt].x1=a[pos].x;
    b[cnt].x2=a[pos].x;
    b[cnt].y1=a[pos].y;
    b[cnt].y2=a[pos].y;
    for(i=pos;i<=n;i++){
        b[cnt].y2=max(b[cnt].y2,a[i].y);
        b[cnt].x2=max(b[cnt].x2,a[i].x);
        b[cnt].x1=min(b[cnt].x1,a[i].x);
        b[cnt].y1=min(b[cnt].y1,a[i].y);
        for(j=1;j<cnt;j++){
            if(b[cnt].x1<=b[j].x2 && b[cnt].y1<=b[j].y2)return;
        }
        if(i<n && cnt==k)continue;
        DFS(i+1,cnt+1,smm+(b[cnt].x2-b[cnt].x1)*(b[cnt].y2-b[cnt].y1));
    }
    return;
}
int main(){
    n=read();k=read();
    int i,j;
    for(i=1;i<=n;i++){
        a[i].y=read();a[i].x=read();
    }
    sort(a+1,a+n+1,cmp);
    memset(b,-1,sizeof b);
    DFS(1,1,0);
    printf("%d\n",ans);
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.stop 阻止事件冒泡 2.prevent 阻止預設事件發生 3.capture 當元素髮生冒泡時,先觸髮帶有該修飾符的元素。若有多個該修飾符,則由外而內觸發。 4.passive 不攔截預設事件,每次事件產生,瀏覽器都會去查詢一下是否有preventDefault阻止該次事件的預設動作。我們加 ...
  • 1 "use strict" 2 3 //載入js文件 4 loadFile([ 5 "./js/lib/WebGL.js",//檢查 是否支持webGL 插件 6 "./js/lib/three_114.min.js",//3d庫 7 "js/func.js" 8 ], main); 9 10 / ...
  • 按鈕點選輸入,是一個非常簡單的控制項,20分鐘就能完成的一個控制項。先看效果: 根據以前的設定,通過json數據動態生成這兩個按鈕,示例中這兩個按鈕對應的json代碼: { label:'標題', value:'h2', defaultValue:'h2', inputName:'RxButtonSel ...
  • 記錄大話設計學習過程。 鏈接:https://pan.baidu.com/s/1JNaagbvOkwAHMBe6vdH8lg 提取碼:ko5t 如果能想到多一個動機去改變一個類,那麼這個類負責的職責就多於一個。 單一職責在企業里就能明顯的體現出來,HR一個類、開發人員一個類、項目經理一個類、測試人員 ...
  • 本人免費整理了Java高級資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分散式等教程,一共30G,需要自己領取。傳送門:https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 前 ...
  • 圖解Java設計模式之建造者模式 蓋房項目需求 傳統方式解決蓋房需求 傳統方式的問題分析 建造者模式基本介紹 建造者模式的四個角色 建造者模式原理類圖 建造者模式在JDK的應用和源碼分析 建造者模式的註意事項和細節 蓋房項目需求 1)需要建房子 :這一過程為打樁、砌牆、封頂2)房子有各種各樣的,比如 ...
  • 使用gRPC做微服務的內部通信 gRPC是一個由Google開源的遠程服務調用框架,具有多路復用和雙向流式通信的特性。 大家好,在本文中將為大家介紹為什麼我們應該使用gRPC代替RESTful或JSON,來開發微服務內部的通信介面。 什麼是gRPC? gRPC是一個高性能的、開源的、普遍通用的RPC ...
  • 1.一個小型網路水果超市,負責給用戶網上訂購蘋果、芒果、桃子、荔枝。用戶可以註冊成為會員,預約、訂購、查詢、取消等常規動作。請設計用例模型.1) 參與者2)用例圖3)一個重要的用例進行描述 2. 畫出類圖 一家公司有許多部門,通過部門名唯一的確定一個部門,每個部門有一名經理主管,也有的經理不管理任何 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...