2019 騰訊正式批筆試題題解


/*
一.n種硬幣,求最少數量的硬幣使得湊出1~m的面值【貪心】

input:
4 20
1 2 5 10
output:
5

二.
消除相鄰為0、1的字符串得到的最短長度
input:4 0101 out:0

三.
賄賂怪獸需要pi的金幣,當之前拐走的所有怪獸武力之和小於當前的怪獸武力di,你需要賄賂它,求最小賄賂值
3
8 5 10
1 1 2
out:2
*/

#include<cstdio> #include<cstring> #include<cmath> #include<bits/stdc++.h> using namespace std; const double PI=acos(-1.0); const double eps=1e-6; const int maxn = 1e5 + 100; int i,n,m,ans,s; int a[maxn]; int main() { scanf("%d%d",&m,&n); s=1; for(i=1;i<=n;i++) cin>>a[i]; sort(a+1, a+n+1); if(a[1]!=1) cout<<"-1"<<endl; while(s<m) { for(i=1;i<=n;i++) if(a[i]>s+1) break; s+=a[i-1]; ans++; } cout<<ans+1<<endl; } /****************/ #include<cstdio> #include<cstring> #include<cmath> #include<bits/stdc++.h> using namespace std; const double PI=acos(-1.0); const double eps=1e-6; const int maxn = 2*1e5 + 100; int n,m,ans; int a[maxn]; char s[maxn]; int main() { scanf("%d%s",&n,s); int c0=0,c1=0; for(int i=0;i<n;i++) if(s[i]=='0') c0++; else c1++; cout<<max(c0-c1,c1-c0)<<endl; } /***************/ #include<cstdio> #include<cstring> #include<cmath> #include<bits/stdc++.h> using namespace std; const double PI=acos(-1.0); const double eps=1e-6; const int maxn = 2*1e5 + 100; int n,m; int p[maxn]; long long d[maxn]; long long tot=0; long long sum[maxn]; int dfs(int id,int sum,int len) { int res=0; if(id==len) { if(sum<d[id]) return p[id]; else return 0; } if(sum>=d[id]) res+=min(p[id]+dfs(id+1,sum+d[id],len),dfs(id+1,sum,len)); else res+=p[id]+dfs(id+1,sum+d[id],len); return res; } int main() { scanf("%d",&n); int ans=0; for(int i=1;i<=n;i++) cin>>d[i]; for(int i=1;i<=n;i++) cin>>p[i]; cout<<dfs(1,0,n)<<endl; } /* 3 8 5 10 1 1 2 4 1 2 4 8 1 2 1 2 */

 1、【貪心】先判斷有無解,如果min(硬幣面額)>1則無解,因為搭配不出1;有1則有解,因為所有面額都可由1累積出來。

假設當前硬幣可以組合出1~5的任意面額,那添加一枚面額為6的硬幣就可以搭配出1~11的任意面額——>假設當前硬幣面值和為sum,每一次添加硬幣時,從大到小搜,將搜到的第一枚面值<=(sum+1)上限的硬幣加入,並將計數器ans+1,更新sum值。(sum表示目前小於等於sum的種類可以被表示,那下一次能增加的面額一定小於等於sum+1,因為如果大於了sum+1,那么從sum+1到此之間的值一定不能被滿足)

2、【簡單數學】稍微自己舉幾個例子,只要字符串中存在有’0’和’1’,就會發生合並而將字符串的長度縮小,所以只要計算出字符串中’0’和’1’出現的最小次數,然后直接乘以2,再使用總長度減去即可(可以證明,當這個序列0和1都還存在,是可以繼續進行消除的,直到某個數字沒有)

3、【選擇性dfs】選或不選,滿足可以擊敗當前怪獸的條件下有min(選:賄賂即累加當前的,不選:不賄賂);不能擊敗直接賄賂


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM