SLF 的锁屏密码

来源:互联网 发布:excel2007表格数据总计 编辑:程序博客网 时间:2024/06/05 06:25

SLF 的锁屏密码
Time Limit: 10000 ms   Case Time Limit: 1000 ms   Memory Limit: 256 MB
Total Submission: 15   Submission Accepted: 9
Judge By Case
Description
SLF 作为一个与众不同的人,他的锁屏密码当然不能和别人一样简简单单的 4 位密码或者是按个爪印就可以了。
每次 SLF 想要开启手机时,他需要手机先告诉他一个数 N,这个数当然不是一个简简单单数字,它是有特殊含义的:
对给定的 N (4≤N≤24),它其实还表示了一个特殊等式-1@2@3@4@5…@N-2@N-1=N,其中字符@可能是加号也可能是减号。
如果 SLF 想要开启手机,他就要输入有多少个符合条件的这样的等式。

Input
输入包含一个整数的单独一行

Output
输出包含一个整数的单独一行表示满足条件的等式的个数

Sample Input
OriginalTransformed
8

Sample Output
OriginalTransformed
4

Hint
即:-1-2-3-4+5+6+7=8
-1-2+3+4+5+6-7=8
-1+2-3+4+5-6+7=8
-1+2+3-4-5+6+7=8

这题的题目条件是允许我们使用穷举的,因为N最多也就2的24次方,时间足够
但穷举的时候遇到一些苦难,首先,你不知道写多少个for循环,才能完成这样一个穷举
我一开始想到的是树,后来发现可以用二进制数进行模拟。
代码如下:

#include<cstdio>
#include<iostream>


using namespace std;


int main()
{
    int a[2];
    a[0]=0;//代表-
    a[1]=1;//代表+
    int N;
    cin>>N;
    int M=0;
    for(int i=1;i<=N-2;i++)
        M=2*M+1;//N个1代表的二进制数对应的十进制数






    int count=0;
    for(int i=0;i<=M;i++)
    {
        int x=i;
        int T=-1;
        for(int j=2;j<=N-1;j++)
        {
            if(a[x%2])   T+=j;
            else         T-=j;
            x/=2;


        }
        if(T==N)
            count++;
    }
    cout<<count<<endl;
    return 0;


}



0 0
原创粉丝点击