upc个人训练赛第十三场:幸运数字+分糖果(二进制+二分)

问题 C: 幸运数字II

题目描述
数字4和7是幸运数字,而其他的都不是幸运数字。一个整数是幸运数字,当且仅当它的十进制表示只包含幸运数字。
现在让你给出第K大的幸运数字。
输入
第一行一个整数K(1<=K<=1,000,000,000)
输出
第K大的幸运数字。
样例输入 Copy
1
样例输出 Copy
4

思路:
4 100
7 111
用0来代表4,用1来代表7
用一个n来代表位数,我们可以发现,这其实就像一个二叉树,n = 1时有两个,n = 2时有四个,即
2^1 = 2
2^2 = 4…
所以我们可以把k+1转化成二进制,可以算出n的大小
只需要去掉头位然后按顺序输出即可

ll k;
int a[35],c[35];
void fun(ll x){
    int i = 0;
    while(x)
    {
        c[++i] = x%2;
        x /= 2;
    }
    for(itn j=1;j<=i;j++)
        a[j] = c[j];
}
 
int main(){
    cin >> k;
    memset(a,0,sizeof(a));
    fun(k+1);
    int s = 32;
    while(a[s] == 0 && s > 1)    s--;//去前导零
    for(int i=s-1;i>=1;i--){
        if(a[i] == 0)   printf("4");
        if(a[i] == 1)   printf("7");
    }
}

问题 D: 分糖果分数

题目描述
幼儿园的N个小朋友得到了M颗糖果。
每个小朋友都有一个想要得到的糖果数目,如果没有达到他们的预期,就会不高兴。不高兴的程度可以用一个数值表示,就是他们无法满足的糖果数目的平方。例如,一个小朋友想要得到32颗糖果,而他只得到29颗糖果,那么有3颗糖果无法满足,因此不高兴值为9.
不幸的是,现有的糖果无法满足所有的小朋友,因此,需要你给出一个分配方案,使得不高兴值的总和最小。
输入
第一行两个整数M和N(1<=M<=210^9)(1<=N<=100,000)
接下来N行,每行一个整数,表示每个孩子想要的糖果数。每个小于2
10^9且总和肯定超过M
输出
最少生气值总和。输出数据保证结果在int64范围之内。
样例输入 Copy
5 3
1
3
2
样例输出 Copy
1

ll m,n,t,tail,sum,ans;
ll a[maxn];
int main()
{
    scanf("%lld%lld",&m,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        sum += a[i];//计算小朋友希望得到的糖果总和 
    }
    if(sum <= m)//如果可以满足,那么没有小朋友会不满意 
    {
        printf("0\n");
        return 0;
    }
    sort(a+1,a+1+n);
    t = m,tail = 0;
    for(int i=n;i>0;i--)
    {
        if(t >= (a[i]-a[i-1])*(n-i+1))
            t -= (a[i]-a[i-1])*(n-i+1);
        else
        {
            ll p = a[i]-t/(n-i+1);
            ll q = t%(n-i+1);
            ans += p*p*(n-i+1-q)+(p-1)*(p-1)*q;
            tail = i;
            break;
        }
    }
    for(int i=0;i<tail;i++)
        ans += a[i]*a[i];
    printf("%lld\n",ans);
    return 0;
}
发布了60 篇原创文章 · 获赞 1 · 访问量 2145

猜你喜欢

转载自blog.csdn.net/magic_wenge/article/details/105521401