洛谷 P1392 取數

2022-05-08 02:06:11 字數 1723 閱讀 6169

題面

在做這道題前,先要會他的弱化版(實際一模一樣,只是愚蠢的洛谷評測級別差了一檔(睿智如姬無夜))

----------------------------------弱化版---------------------

弱化版

實際只是把矩陣行數改成兩行而已

sol:先排序,後考慮乙個序列a[1]+b[1],a[2]+b[1],a[3]+b[1],······,a[n-1]+b[1],a[n]+b[1];

顯然對於上乙個序列而言 a[1]+b[1]<=a[1]+b[2], a[2]+b[1]<=a[2]+b[2], a[3]+b[1]<=a[4]+b[2]

雖然上面反應的只是以a分成的n個組中a[i]+(b[1]到b[2]到b[3]···到b[n])每組序列嚴格遞增

但是利用小根堆就可以完成要求了每次彈出堆頂元素,在壓入彈出元素組別的下乙個數

#include #include 

using

namespace

std;

const

int n=100005

;int n,a[n],b[n],size=0

,to[n];

struct nodeheap[n*2

];inline

void up(int

x)else

break

; }

return;}

inline

void down(int

x)else

break

; }

return;}

inline

void insert(int v,int id);up(size);}

inline node top()

inline

void pop()

intmain()

for(i=1;i<=n;i++)

printf("\n

");}

----------------------------------強化版---------------------

這就是對於第一行,和第二行合併,得到新的序列,在用新序列與下乙個合併,就解決了

#include #include 

using

namespace

std;

const

int n=1005

;int n,m,k,a[2][n],b[n],size=0

,to[n];

struct nodeheap[n*2

];inline

void up(int

x)else

break

; }

return;}

inline

void down(int

x)else

break

; }

return;}

inline

void insert(int key,int id);up(size);}

inline node top()

inline

void pop()

intmain()

for(j=1;j<=k;j++)

}for(i=1;i<=k;i++)printf("

%d "

,a[t][i]);

}

洛谷P1392 取數 堆

題目傳送門 在乙個n行m列的數陣中,你須在每一行取乙個數 共n個數 並將它們相加得到乙個和。對於給定的數陣,請你輸出和前k小的取數方法。輸入格式 第一行,三個數n,m,k。第2 n 1行,每行m個正整數 輸出格式 一行共k個數,代表在每一行取乙個數前k小的加和 輸入樣例 1 複製 3 3 2 1 2...

洛谷 p1123取數遊戲

定義乙個dfs函式,函式有三個變數,分別是i,j,sum。i,j分別代表訪問的這個點的座標,sum表示這條路徑上的數字的和。思路是 從 1,1 這個點進入,依次以先列數增加,然後行數增加在訪問所有的點。如下 include include include using namespace std in...

洛谷 P1123 取數遊戲

洛谷傳送門 乙個n times mn m的由非負整數構成的數字矩陣,你需要在其中取出若干個數字,使得取出的任意兩個數字不相鄰 若乙個數字在另外乙個數字相鄰88個格仔中的乙個即認為這兩個數字相鄰 求取出數字和最大是多少。第1行有乙個正整數tt,表示了有tt組資料。對於每一組資料,第一行有兩個正整數nn...