[编程题] 数组变换

来源:互联网 发布:大逃杀cmd重置网络 编辑:程序博客网 时间:2024/05/22 13:28
牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。
牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。
这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。

输入描述:
输入一个正整数N (N <= 50)接下来一行输入N个正整数,每个数均小于等于1e9.


输出描述:
假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO"

输入例子:
21 2

输出例子:
YES
1
#include <iostream>
2
#include <cstring>
3
using namespace std;
4
string change(unsigned long a)
5
{
6
    int bit[32]={0};
7
    int i=32;
8
    while(a)
9
    {
10
        bit[i--]=a&1;
11
        a>>=2;
12
    }
13
    string s;
14
    for(i=0;i<32;i++)
15
        s+=bit[i];
16
    return s;
17
}
18
bool isSub(string s1,string s2)
19
{
20
    bool flag=false;
21
    int len=s2.size()-s1.size();
22
    if(len<0)
23
        return flag;
24
    int i;
25
    for(i=0;i<len;i++)
26
    {
27
        if(s1==s2.substr(i,s1.size()))
28
        {
29
            flag=true;
30
            break;
31
        }
32
    }
33
     return flag;
34
}
35
int main()
36
{
37
    int n;
38
    while(cin>>n)
39
    {
40
        unsigned long data[50];
41
        int i;
42
        for(i=0;i<n;i++)
43
            cin>>data[i];
44
        bool flag=true;
45
        string str=change(data[0]);
46
        str+=str;
47
        for(i=1;i<n;i++)
48
        {
49
            string s=change(data[i]);
50
            if(!isSub(s,str))
51
            {
52
                flag=false;
53
                break;
54
            }
55
        } 
56
        if(flag)
57
            cout<<"YES"<<endl;
58
        else
59
            cout<<"NO"<<endl;
60
    }
61
}
原创粉丝点击