Codeforces Round #219 (Div. 2)

u010660276發表於2013-12-23

B:

剛開始居然腦殘的一個一個加了。。。

思路:二分列舉長度,判斷是否費用超出w。

下面是程式碼:

#include<iostream>
using namespace std;
typedef long long LL;
const LL INF=1e17;
LL w,m,k;
LL cal(LL x)
{
    if(x<10)
    return x;
    LL i=1,sum=0,bit=1;
    for(;i*10<=x;i*=10,bit++)
    {
        sum+=bit*i*9;
    }
    LL digit=x/i%10;
    sum+=(digit-1)*i*bit;
    sum+=(x%i+1)*bit;
    return sum;
}
int main()
{
    cin>>w>>m>>k;
    LL l=0,r=INF-m,mid,ans=0;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(cal(m+mid-1)-cal(m-1)<=w/k)
        {
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    cout<<ans<<endl;
    return 0;

}

C:一個袋鼠可以裝下比他的1/2小的袋鼠,問最多還剩多少袋數在外面一個袋鼠只能裝一個。

思路:先排序,然後雙指標遍歷。

下面是程式碼:

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=500000;
vector<int> a(500000);
int N;
int main()
{
    cin>>N;
    for(int i=1;i<=N;i++)
    scanf("%d",&a[i]);
    sort(a.begin()+1,a.begin()+N+1);
    int i=1,j=N/2+1;
    int ans=N;
    while(i<=N/2&&j<=N)
    {
        if(a[j]>=a[i]*2)
        {
            ans--,j++,i++;
        }
        else j++;
    }
    cout<<ans<<endl;
    return 0;
}



相關文章