洛谷八連測 R4 T3 但有用題解 (思想題)

2022-08-14 07:09:12 字數 1816 閱讀 3570

題面:

題目描述

給定乙個 n ∗ m 個矩陣,矩陣中每個數都是 [1, 12] 內的整數。你可以執行下列兩個操作任意多次:

• 指定一行,將該行所有數字 +1.

• 指定一列,將該列所有數字 +1.

如果執行完上述操作之後,矩陣中某個數變成了 3, 6, 9, 12 其中的某乙個,我們認為這個數是穩的。

給定初始矩陣,求出任意執行操作之後穩數的最多個數。

輸入輸出格式

輸入格式:

第一行包含兩個正整數 n, m。

接下來 n 行,每行 m 個數,描述這個矩陣。

輸出格式:

乙個整數,表示答案。

輸入輸出樣例

輸入樣例#1:

3 3

1 2 3

3 2 4

1 2 1

輸出樣例#1:

7輸入樣例#2:

5 52 4 6 8 10

1 2 3 4 5

3 4 5 6 7

7 8 9 10 11

5 10 12 3 7

輸出樣例#2:

20說明

測試點編號   限制與約束

1        n,m<=2

2        n,m<=5

3~10       n,m<=10

這道題其實是一道送分題,出題人為了暗示這一點把資料出的非常奇怪,題意也只是加法,沒有減法,還給了兩個spj,剩下80分就沒有給部分分了。(然而我這個菜雞還是沒想出來,只能打o(12n+m*n*m)大暴力水一水qaq)

這道題騙分思路就是直接暴力列舉每行每列每個數加多少,優化一下,可以發現每行或者每列只用加0或1或2這3個數,因為既然加這3個數就可以達到目的,就沒必要再加更大的數字,避免超出12的範圍,這樣一來複雜度就變成o(3n+m*n*m)但並沒有什麼*用。

但只要我們從列舉這裡下手優化,就可以發現乙個奇妙的方法,使得時間複雜度變成o(3n+1*n*m)。

正解思路:

我們可以先確定每行(或者每列,這個由自己決定,我是先確定每行)要加多少,再列舉每列(每行)加的數,選取其中的最優值,加入答案,輸出即可。

**如下:

#includeusing

namespace

std;

#define for(l,r,i) for(int i=l;i<=r;++i)

const

int n=11

;int n,m,ans,a[n][n],c[n][3],d[n];//

a[i][j]代表第i行第j列的數字

//c[j][k]代表第j列加上k後滿足條件的答案,d[i]代表第i行要加的數。

templateinline void read(t &x)//

讀入優化

while(ch>='

0'&&ch<='9')

x=f ? -x:x;

return;}

inline

int check(int x)//

判斷此時被更改過的點是否越界,是否滿足「穩」的條件。

void dfs(int

x) ans=max(ans,res);//

加入到答案中。

return

; }

for(

0,2,i)

d[x]=i,dfs(x+1);//

確定每行加的值。

return;}

intmain()

浴谷八連測R4題解

一開始出了點bug能看見排行榜,於是我看見我半個小時就a掉了前兩題,信心場qaq t1字串題就不說了qwq include include include include include define ll long long using namespace std const int maxn 5...

洛谷八連測 R7

list 題目鏈結 t1 每次spfa 或者bfs 時間複雜度o spfa q 每次先把每乙個查詢的特殊點入隊,距離為0 spfa或者bfs即可。include include include include include include define ll long long using nam...

洛谷八連測 R8

題目鏈結 答案是求c1 x 1 ck 1 n 1 ckn x 取得最大值時的x值。數學題。化簡,求單調性。對每一門成績都建一棵樹。每條邊都加一條反向邊。能夠通過正向邊到達的點都是比自己成績低的,反向邊則是比自己高的。最好成績是只有三門成績蒐比自己高時才比自己高。最壞成績是只有三門都比自己低時才比自己...