藍橋杯刷題(一)


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;
}

 


免責聲明!

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



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