1.分巧克力
題目鏈接:http://lx.lanqiao.cn/problem.page?gpid=T441
題解:一看就知道只是一道二分題,因此思路就很好辦了,二分區間【1,100000】,
然后進行判斷是否分出的巧克力數大於等於K,若大於等於K就將L=mid
否則R=mid-1,最終的答案就是L。需要注意的是h和w不能盲目的根據面積去分巧克力,應該分別用(h/num)*(w/num)這樣算出來的才是正確的巧克力數
代碼:
#include<iostream> using namespace std; const int N=100010; int n,k; int h[N],w[N]; bool check(int num) { int ans=0; for(int i=0;i<n;i++) ans+=(h[i]/num)*(w[i]/num); if(ans>=k) return true; else return false; } int main() { int i,j; cin>>n>>k; for(i=0;i<n;i++) cin>>h[i]>>w[i]; int l=1,r=100000,mid=0; while(l<r) { mid=(l+r+1)>>1; if(check(mid)) l=mid; else r=mid-1; } cout<<l; return 0; }
2.日期問題
題目:http://lx.lanqiao.cn/problem.page?gpid=T443
題解:這道題可以用枚舉來做,數據范圍不大,可以用數據范圍從【19600101,20591231】
分別去除對應的year,month,day進行判斷,首先判斷是否為合法日期,在判斷能否和數據對應上
在判斷日期合法時需要注意的細節有:day==0||month==0記得要判斷,其次就是平年和閏年的2月的日期要注意
代碼:
#include<iostream> #include<cstdio> using namespace std; int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool check(int year,int month,int day) { if(day==0||month==0||month>12) return false; if(month!=2&&day>months[month]) return false; if(month==2) { int k=0; if(year%4==0&&year%100!=0||year%400==0) k=1; if(day>28+k) return false; } return true; } int main() { int i,j,data,a,b,c; int year,month,day; scanf("%d/%d/%d",&a,&b,&c); for(data=19600101;data<=20591231;data++) { year=data/10000;month=(data%10000)/100;day=data%100; if(check(year,month,day)) { if(year%100==a&&month==b&&day==c|| month==a&&day==b&&year%100==c|| day==a&&month==b&&year%100==c) { printf("%d-%02d-%02d\n",year,month,day); } } } return 0; }
3.包子湊數
題目:http://lx.lanqiao.cn/problem.page?gpid=T440
題解:這道題有兩個難點,其一是范圍:最大到多少之后就都能得到,100籠每籠最多100個,因此封頂范圍10000;
其二判斷何時為INF,當所有包子的最小公約數不為1時,就有無限個湊不出來。
對於有限個湊不出來的數,我們用dp來進行解決。
dp[n],代表n個包子能否湊出來,狀態轉移為dp[n-a[i]]是否能湊出來,如果可以,那么他也能湊出來
因此外層循環每籠包子的個數,內層循環從1-MAXN,來進行便利所有包子數
最后計算沒能湊出包子的個數,即可。
代碼:
#include<iostream> using namespace std; const int N=10010; int n; int a[110]; bool f[N+10]; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int i,j,k=0; cin>>n; for(i=0;i<n;i++) { cin>>a[i]; k=gcd(k,a[i]); } if(k!=1) { cout<<"INF"; } else { f[0]=true; for(i=0;i<n;i++) { for(j=a[i];j<=N;j++) f[j]|=f[j-a[i]]; } int ans=0; for(i=1;i<=N;i++) { if(f[i]==false) ans++; } cout<<ans; } return 0; }