P3227 [HNOI2013]切糕

来源:http://www.cnblogs.com/zwfymqz/archive/2017/08/10/7341391.html
-Advertisement-
Play Games

題目描述 經過千辛萬苦小 A 得到了一塊切糕,切糕的形狀是長方體,小 A 打算攔腰將切糕切成兩半分給小 B。出於美觀考慮,小 A 希望切麵能儘量光滑且和諧。於是她找到你,希望你能幫她找出最好的切割方案。 出於簡便考慮,我們將切糕視作一個長 P、寬 Q、高 R 的長方體點陣。我們將位於第 z層中第 x ...


題目描述

經過千辛萬苦小 A 得到了一塊切糕,切糕的形狀是長方體,小 A 打算攔腰將切糕切成兩半分給小 B。出於美觀考慮,小 A 希望切麵能儘量光滑且和諧。於是她找到你,希望你能幫她找出最好的切割方案。

出於簡便考慮,我們將切糕視作一個長 P、寬 Q、高 R 的長方體點陣。我們將位於第 z層中第 x 行、第 y 列上(1≤x≤P, 1≤y≤Q, 1≤z≤R)的點稱為(x,y,z),它有一個非負的不和諧值 v(x,y,z)。一個合法的切麵滿足以下兩個條件:

  1. 與每個縱軸(一共有 P*Q 個縱軸)有且僅有一個交點。即切麵是一個函數 f(x,y),對於所有 1≤x≤P, 1≤y≤Q,我們需指定一個切割點 f(x,y),且 1≤f(x,y)≤R。

  2. 切麵需要滿足一定的光滑性要求,即相鄰縱軸上的切割點不能相距太遠。對於所有的 1≤x,x’≤P 和 1≤y,y’≤Q,若|x-x’|+|y-y’|=1,則|f(x,y)-f(x’,y’)| ≤D,其中 D 是給定的一個非負整數。 可能有許多切麵f 滿足上面的條件,小A 希望找出總的切割點上的不和諧值最小的那個。

輸入輸出格式

輸入格式:

 

第一行是三個正整數P,Q,R,表示切糕的長P、 寬Q、高R。第二行有一個非負整數D,表示光滑性要求。接下來是R個P行Q列的矩陣,第z個 矩陣的第x行第y列是v(x,y,z) (1<=x<=P, 1<=y<=Q, 1<=z<=R)。 100%的數據滿足P,Q,R<=40,0<=D<=R,且給出的所有的不和諧值不超過1000。

 

輸出格式:

 

僅包含一個整數,表示在合法基礎上最小的總不和諧值。

 

輸入輸出樣例

輸入樣例#1:
2  2 2
1
6  1
6  1
2  6
2  6
輸出樣例#1:
6

說明

最佳切麵的f為f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1

 

 

我們將點轉化成邊,那麼選點就等於割邊,第一個條件滿足

對於第二個條件我們可以用一些inf的邊來"屏蔽"那些不能割的邊,從z向"相鄰的"路徑的z-d號點連inf的邊(如上圖)這樣做之後,如果刪了這條邊,我們還可以通過這些橋梁,從相鄰的路徑的一段[z-d,z+d]繞過,所以割那些邊就沒有意義了

從而實現必須割[z-d,z+d]的目的

來源:洛谷題解

 

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<queue>
  6 using namespace std;
  7 const int MAXN=200001;
  8 const int INF = 1e8;
  9 inline void read(int &n)
 10 {
 11     char c='+';int x=0;bool flag=0;
 12     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
 13     while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
 14     n=flag==1?-x:x;
 15 }
 16 int n,m,s,t;
 17 struct node
 18 {
 19     int u,v,flow,nxt;
 20 }edge[MAXN];
 21 int head[MAXN];
 22 int cur[MAXN];
 23 int num=0;
 24 int deep[MAXN];
 25 int tot=0;
 26 void add_edge(int x,int y,int z)
 27 {
 28     edge[num].u=x;
 29     edge[num].v=y;
 30     edge[num].flow=z;
 31     edge[num].nxt=head[x];
 32     head[x]=num++;
 33 }
 34 void add(int x,int y,int z)
 35 {
 36     add_edge(x,y,z);
 37     add_edge(y,x,0);
 38 }
 39 bool BFS()
 40 {
 41     memset(deep,0,sizeof(deep));
 42     deep[s]=1;
 43     queue<int>q;
 44     q.push(s);
 45     while(q.size()!=0)
 46     {
 47         int p=q.front();
 48         q.pop();
 49         for(int i=head[p];i!=-1;i=edge[i].nxt)
 50             if(!deep[edge[i].v]&&edge[i].flow)
 51                 deep[edge[i].v]=deep[edge[i].u]+1,
 52                 q.push(edge[i].v);
 53     }
 54     return deep[t];
 55     
 56 }
 57 int DFS(int now,int nowflow)
 58 {
 59     if(now==t||nowflow<=0)
 60         return nowflow;
 61     int totflow=0;
 62     for(int &i=cur[now];i!=-1;i=edge[i].nxt)
 63     {
 64         if(deep[edge[i].v]==deep[edge[i].u]+1&&edge[i].flow)
 65         {
 66             int canflow=DFS(edge[i].v,min(nowflow,edge[i].flow));
 67             edge[i].flow-=canflow;
 68             edge[i^1].flow+=canflow;
 69             totflow+=canflow;
 70             nowflow-=canflow;
 71             if(nowflow<=0)
 72                 break;
 73         }
 74     
 75     }
 76     return totflow;
 77 }
 78 void Dinic()
 79 {
 80     int ans=0;
 81     while(BFS())
 82     {
 83         memcpy(cur,head,MAXN);
 84         ans+=DFS(s,1e8);
 85     }
 86     printf("%d",ans);
 87 }
 88 int a[41][41][41];
 89 int cnt=0;
 90 int xx[5]={-1,+1,0,0};
 91 int yy[5]={0,0,-1,+1};
 92 int main()
 93 {
 94     memset(head,-1,sizeof(head));
 95     int P,Q,R,D;
 96     read(P);read(Q);read(R);read(D);
 97     for(int i=1;i<=R+1;i++)
 98         for(int j=1;j<=P;j++)
 99             for(int k=1;k<=Q;k++)
100                 a[i][j][k]=++cnt;
101     s=0;t=cnt+1;
102     for(int i=1;i<=P;i++)
103         for(int j=1;j<=Q;j++)
104         {
105             add(s,a[1][i][j],INF);
106             add(a[R+1][i][j],t,INF);//上下界 
107         }
108     for(int i=1;i<=R;i++)
109         for(int j=1;j<=P;j++)
110             for(int k=1;k<=Q;k++)
111             {
112                 int p;read(p);
113                 add(a[i][j][k],a[i+1][j][k],p);
114             }// 連邊 
115     for(int i=D+1;i<=R;i++)
116         for(int j=1;j<=P;j++)
117             for(int k=1;k<=Q;k++)
118                 for(int m=0;m<4;m++)
119                     if(a[i-D][j+xx[m]][k+yy[m]]>0)
120                         add(a[i][j][k],a[i-D][j+xx[m]][k+yy[m]],INF);
121     //for(int i=1;i<=num-1;i++)
122     //printf("%d %d %d\n",edge[i].u,edge[i].v,edge[i].flow);
123     Dinic();
124     return  0;
125 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 一 python第一個程式 二 變數 2.1 變數名稱規則 變數名只能是 字母、數字或下劃線的任意組合 變數名的第一個字元不能是數字 以下關鍵字不能聲明為變數名 ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', ' ...
  • 特殊字元 . 通配符 \ 轉義字元 [ ] 字元集 ( | ) 選擇字元 ? * + 重覆 (?一次或沒有,* 零次或多次 >=0, + 一次或多次 >=1) ^ 以什麼開頭 $ 以什麼結尾 re模塊中操作正則表達式的函數 pat = re.compile(pattern) 將正則表達式轉換為模式對 ...
  • 這裡繼續dubbo的源碼旅程,在過程中學習它的設計和技巧,看優秀的代碼,我想對我們日程編碼必然有幫助的。而那些開源的代碼正是千錘百煉的東西,希望和各位共勉。 拿ProtocolListenerWrapper為例子,看源碼的時候發現它是一個裝飾類的標準實現有一個自身的複製構造函數,把被包裝者複製進來, ...
  • 3.python函數與模塊 python的函數定義: 以def關鍵字定義一個函數; 參數放在小括弧裡面; 必須有return語句; 關鍵字參數: 即調用函數時傳參順序可以人為指定 預設參數: 預設參數必須放在非預設參數的後面 可變參數: 帶*的參數為可變參數,表示所有未命名參數元組 ...
  • 題目描述 對於一個五位數a1a2a3a4a5,可將其拆分為三個子數: sub1=a1a2a3 sub2=a2a3a4 sub3=a3a4a5 例如,五位數20207可以拆分成 sub1=202 sub2=020(=20) sub3=207 現在給定一個正整數K,要求你編程求出10000到30000之 ...
  • 題目背景 第二次世界大戰時期.. 題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若幹名英國飛行員很好地配合。如何選擇配對飛行 ...
  • I'm changing the background color based on the data but it makes my text hard to read so I need to change the font color (to white if I have a darker ...
  • 案例1: 演示FileInputStream類的使用(用FileInputStream的對象把文件讀入到記憶體) 首先要在E盤新建一個文本文件,命名為test.txt,輸入若幹字元 運行程式,控制台輸出test.txt中輸入的字元。 案例2: 演示FileOutputStream的使用(把輸入的字元串 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...