暴力列舉 洛谷入門

2021-10-10 11:58:07 字數 3959 閱讀 9108

問題一:

p2241 統計方形(資料加強版)

題目描述

有乙個 n×m 方格的棋盤,求其方格包含多少正方形、長方形(不包含正方形)。

輸入格式

一行,兩個正整數 n≤5000,m≤5000)。

輸出格式

一行,兩個正整數,分別表示方格包含多少正方形、長方形(不包含正方形)。

輸入輸出樣例

輸入

2 3輸出

8 10

問題分析:

智商不配做暴力列舉了,不知道為什麼暴力列舉的題就算簡單我也不會,這題本質找規律,這種題目我都不擅長…

但要注意的點是,題目雖然是int型別的m、n,但多次相乘要讓m、n超出int界限,所以要開long long

正確**:

#include

using

namespace std;

long

long squ;

long

long rec;

intmain()

else}}

cout<" "<}

問題2:

p2089 烤雞走這

問題分析:

所有人除了我都會做的烤雞

該題目宣告10個變數for迴圈即可

正確**:

#include

using

namespace std;

/*只用乙個變數表示十種調料的狀態是不可能的,因此,每個調料都要用變數表示*/

int a,b,c,d,e,f,g,h,i,j,k;

//k用來記錄方案個數

/*可以用乙個陣列,每個陣列元素儲存乙個調料的狀態*/

/*也可以在迴圈一次,二次迴圈分別輸出方案數和調料各為多少*/

/*主要就在10個變數的建立每個從1~3變化,所以用乙個變數代表調料,乙個代表調料種類是不現實的*/

int tiao[

1000000];

int m;

//記錄陣列下標

intmain()

//因為輸入的n是正整數,所以不用從0開始 }}

}}}}

}}}}

cout

1;a<=

3;a++

)//表示調料a從1~3}}

}}}}

}}}}

}

問題三:

p1618 三連擊(公升級版)走這

問題分析:

這題我的想法是用9個數字排列組合,有這種想法但是不會做…

看了題解,發現直接列舉三位數即可

再利用條件可以減少列舉的量

正確**:

#include

using

namespace std;

int nums[10]

;/*可以直接列舉三位數,這樣就不用考慮不同的組合*/

bool

divide

(int i)

nums[i/10%

10]++;

if(nums[i/10%

10]>1)

nums[i/

100]++;

if(nums[i/

100]

>1||

(i/100

)>=10)

return

true;}

intmain()

else}if

(flag==0)

}

問題四:

p3392 塗國旗走這

問題分析:

又是除了我所有人都會的塗國旗,一開始看錯題目,以為可以間隔塗色= =

這裡直接列舉每個顏色所佔的行數即可

正確**:

#include

using

namespace std;

int w[51]

;//這樣就不用分別統計每行要塗的個數並且比較

int b[51]

;int r[51]

;int n,m;

/*分別表示把前i行塗成w\b\r三種顏色需要花費的格仔數*/

/*1~i行是白色 i+1~j是藍色 j+1~n是紅色

所以需要花費的格仔數是 w(i)+b(j)-b(i)+r(n)-r(j)

*/string s;

intcheck

(char c)

}return res;

}int

main()

//w(i)+b(j)-b(i)+r(n)-r(j) i必須》=1,j//此處需要列舉所有i、j的可能性

for(

int i=

1;i1;i++

)//i 從1開始表示只塗一行

} cout<}

這裡大佬的**進行了預處理,我屬實想不到

先統計每行塗成其他顏色需要花費的格仔數,在列舉比較

問題五:

p1149 火柴棒等式走這

問題分析:

壓根不會,看了大佬的**才懂,這裡可以直接列舉和深度搜尋兩種方式

直接列舉將24根火柴最多能表示的數字作為界限,求出1到界限所有數分別用的火柴數,在迴圈列舉加數即可

暴力列舉的**:

#include

using

namespace std;

/*最多24根火柴棒,考慮一下極限,如果只有乙個加數,那麼這個加數最小是?

列舉0~這個最小數要用的火柴棒,將它們記錄在乙個陣列裡

然後再通過列舉0~最小數(加數、被加數、和)的火柴棒之和,看是否會是n

*/int c[10]

=;//通過基礎的0~9可以求出其他的十位、百位等數

int a[

3200]=

;//用此陣列,記錄0~最小數所有數要用的火柴數

int j;

int cnt;

int n;

intmain()

//先給0位賦值,那麼就不需要在迴圈裡判斷是否為0

//如果要得到j的每一位,那麼就要讓迴圈終止條件為j=0

}for

(int i=

0;i<=

1000

;i++)}

}printf

("%d"

,cnt)

;return0;

}

做題時一直想非個位數將其分解後每一位如何儲存,沒想到直接用賦值前的a陣列儲存,我的智商不配刷洛谷

也可以用dfs求解每個加數,將符合條件的加上:

正確**:

#include

using

namespace std;

int n;

int a[

2025]=

;int b[4]

;//儲存等式的數字

int cnt;

void

dfs(

int s)

//用來記錄收到了第幾個加數

}else

n+=a[i];}

}}intmain()

dfs(1)

; cout<}

暴力列舉基本上很多題都要用到dfs,這裡先將我這個菜雞不會做的暴力列舉題列出,dfs等題目再做點,最後來個總結

暴力入門 排列與組合列舉

排列和組合列舉都是暴力基礎啦,雖然很簡單但是總結一下比較好 組合 先從簡單的說起吧,比如說從n個數里選k個 先放 void combination int cur,int cnt cur為當前數,cnt為已選擇數的個數 conbination 1,0 這裡的n,k,cur,cnt均指序號 這種思路並...

洛谷P1161 開燈(暴力)

在一條無限長的路上,有一排無限長的路燈,編號為1,2,3,4,1,2,3,4,1,2,3,4,每一盞燈只有兩種可能的狀態,開或者關。如果按一下某一盞燈的開關,那麼這盞燈的狀態將發生改變。如果原來是開,將變成關。如果原來是關,將變成開。在剛開始的時候,所有的燈都是關的。小明每次可以進行如下的操作 指定...

Wythoff Game(暴力列舉)

wythoff game 時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 最近 zkc同學在學博弈,學到了乙個偉大的博弈問題 威佐夫博弈。相信大家都學過了吧?沒學過?沒問題。我將要為你講述一下這個偉大的博弈問題。有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲...