【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果
生活随笔
收集整理的這篇文章主要介紹了
【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題描述
有 3030 個籃子,每個籃子里有若干個蘋果,籃子里的蘋果數(shù)序列已經(jīng)給出。
現(xiàn)在要把蘋果分給小朋友們,每個小朋友要么從一個籃子里拿三個蘋果,要么從相鄰的三個籃子里各拿一個蘋果。
蘋果可以剩余,而且不同的拿法會導(dǎo)致不同的答案。比如對于序列3 1 3 ,可以分給兩個小朋友變成0 1 0;也可以分給一個小朋友變成2 0 2,此時不能繼續(xù)再分了。所以答案是 22 。
求問對于以下序列,最多分給幾個小朋友?
只要是求最多or最少,95%都是寬搜或深搜的思路
網(wǎng)上有很多用貪心解的博客, 壓根不對, 本題貪心只能出樣例, 換個刁鉆點(diǎn)的數(shù)據(jù)就錯了。
正確的思路是DFS,拿取個數(shù)只有兩種操作, 要么單一-3,要么相鄰三個-1, 那么只要用深搜模擬, 對每種可能性進(jìn)行遍歷, 自然可以求出最小值。
需要注意: 如果單純的用搜索跑, 那么每一個數(shù)字都有取相鄰兩個各減一和取這個數(shù)字減三的操作, 也就是說, 需要跑3的30次方次,對于計(jì)算機(jī)來說還是很慢的, 因此需要用剪枝優(yōu)化一下。
參考代碼
#include<bits/stdc++.h> using namespace std;int ans = 0; int a[117] = {7,2,12,5,9, 9,8,10,7,10, 5,4,5,8,4, 4,10,11,3,8, 7,8,3,2,1, 6,3,9,7,1}; int sum[117];void dfs(int idex, int num) {if(idex == 30) {ans = max(ans, num);return;}if(sum[idex] / 3 + num < ans) return; //剪枝優(yōu)化//不公用dfs(idex+1, num+a[idex]/3);//往后公用 if(idex+2 < 30) {int min_num = min(a[idex], a[idex + 1]);min_num = min(min_num, a[idex+2]); //共用最多能分幾個for(int k = 1; k <= min_num; k++) {for(int i = 0; i < 3; i++) a[idex+i] -= k;dfs(idex+1, num+a[idex]/3+k);for(int i = 0; i < 3; i++) a[idex+i] += k;} } }int main() {for(int i = 29; i >= 0; i--) sum[i] = sum[i + 1] + a[i];for(int i = 0; i < 30; i++) cout << sum[i] << ' ';dfs(0, 0);cout << ans << endl;return 0; }撥云見日 未來可期
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【解题报告+通法】_九宫幻方 蓝桥杯 2
- 下一篇: 【解题报告+思路拓展】蓝桥杯 拉马车 2