題面:
題目描述
給定乙個 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)。
正解思路:
我們可以先確定每行(或者每列,這個由自己決定,我是先確定每行)要加多少,再列舉每列(每行)加的數,選取其中的最優值,加入答案,輸出即可。
**如下:
#includeusingnamespace
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值。數學題。化簡,求單調性。對每一門成績都建一棵樹。每條邊都加一條反向邊。能夠通過正向邊到達的點都是比自己成績低的,反向邊則是比自己高的。最好成績是只有三門成績蒐比自己高時才比自己高。最壞成績是只有三門都比自己低時才比自己...