Aaronson,又是思维题

Posted wish-all-ac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aaronson,又是思维题相关的知识,希望对你有一定的参考价值。

题目:

  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
",ans);
    }
    return 0;
} 

 

以上是关于Aaronson,又是思维题的主要内容,如果未能解决你的问题,请参考以下文章

Report,又是一道思维题

HDU - 5101 - Select(简单思维)

CDCPC有感

CDCPC有感

如何使 FAB 避免在 ViewPager 中移动,但又是其中的片段的一部分?

程序员面试题精选题