問題一:
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同學在學博弈,學到了乙個偉大的博弈問題 威佐夫博弈。相信大家都學過了吧?沒學過?沒問題。我將要為你講述一下這個偉大的博弈問題。有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲...