码迷,mamicode.com
首页 > 其他好文 > 详细

Aaronson,又是思维题

时间:2020-04-02 11:55:22      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:XML   clu   eve   peter   recently   content   tin   org   data   

题目:

  Recently, Peter saw the equation x0+2x1+4x2+...+2mxm=nx0+2x1+4x2+...+2mxm=n. He wants to find a solution (x0,x1,x2,...,xm)(x0,x1,x2,...,xm) in such a manner that i=0mxi∑i=0mxi is minimum and every xixi (0im0≤i≤m) is non-negative.

Input 

  There are multiple test cases. The first line of input contains an integer T(1T105)(1≤T≤105), indicating the number of test cases. For each test case:


  The first contains two integers nn and m(0n,m109)(0≤n,m≤109).

Output

  For each test case, output the minimum value of i=0mxi∑i=0mxi.

 
Sample Input

10
1 2
3 2
5 2
10 2
10 3
10 4
13 5
20 4
11 11
12 3

Sample Output

1
2
2
3
2
2
3
2
3
2

题意:

  给你一个方程:x0+2x1+4x2+...+2mxm=n,找一组非负的解,使得x0+x1+...+xm最小。能不能有小数呢?题目没说。。。但是根据样例可以发现,是不会有小数的。

分析:

  我们想一想如果想要x的和最小,那肯定要让系数大的x最大,所以解就是:n/2m。但是,我也不知道为啥它就不能有小数,这可能是题意不明,我们就把xi属于N当成条件就好了。既然这样,n/2m不一定是小数,那么直接计算就不行了,但是总体的思路没有变,要x前面系数大的x大。然后,我们就考虑把n拆成二进制,于是每一位对应一个x,我们把m+1位及以上的数都加到xm身上,剩下的哪一位有数加在哪就好了,问题直接解决。

代码

  

#include <cstdio>
int main(){
    int t;
    scanf("%d",&t);
    for(int jsjs=1;jsjs<=t;jsjs++){
        int n,m;
        scanf("%d%d",&n,&m);
        int ans=0;
        for(int i=1;i<=m&&n;i++){//m可能很大,防止t掉
            ans+=(n&1);
            n>>=1;
        }
        ans+=n;
        printf("%d\n",ans);
    }
    return 0;
} 

 

Aaronson,又是思维题

标签:XML   clu   eve   peter   recently   content   tin   org   data   

原文地址:https://www.cnblogs.com/wish-all-ac/p/12618480.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!