数组变换--全国模拟(三)

[编程题] 数组变换
时间限制:1秒
空间限制:32768K
牛牛有一个数组,里面的数可能不相等,现在他想把数组变为:所有的数都相等。问是否可行。
牛牛可以进行的操作是:将数组中的任意一个数改为这个数的两倍。
这个操作的使用次数不限,也可以不使用,并且可以对同一个位置使用多次。
 
输入描述:
输入一个正整数N (N <= 50) 接下来一行输入N个正整数,每个数均小于等于1e9.
 
 
输出描述:
假如经过若干次操作可以使得N个数都相等,那么输出"YES", 否则输出"NO"
 
输入例子:
2 1 2
 
输出例子:
YES
 
解题思路:题目中是将数组中数改为这个数的2倍(可多次),然后让数组中所有数都相等,因此想到将数组排序,然后使得每个数改变后与最大数比较,应都等于最大数才符合条件。
1)将数组排序
2)遍历整个数组,若该位每次扩大为其本身的2倍后等于数组中最大数,则符合条件count++
3)比较count与数组中数目是否相同,相同返回真,否则返回假
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;
 8     while(cin>>n)
 9     {
10         int count=0;
11         int a[n];
12         for(int i=0;i<n;i++)
13         {
14             cin>>a[i];
15         }
16 
17         sort(a,a+n);
18         for(int i=0;i<n;i++)
19         {
20             int j = a[i];
21             for(;j<a[n-1];)
22             {
23                 j *= 2;
24             }
25             if(j == a[n-1])
26             {
27                 count++;
28             }
29         }
30         if(count == n)
31         {
32             cout<<"YES"<<endl;
33         }
34         else
35         {
36             cout<<"NO"<<endl;
37         }
38     }
39     return 0;
40 }
网上方法:对于每个数一直除2,然后最后check是否相等即可。
 1 #include <bits/stdc++.h>
 2  
 3 using namespace std;
 4  
 5 int a[55];
 6 int main() {
 7     int n;
 8     cin >> n;
 9     for(int i = 0; i < n; i++) cin >> a[i];
10     string res = "YES";
11     for(int i = 0; i < n; i++) {
12         while(!(a[i] & 1)) a[i] >>= 1;
13     }
14     for(int i = 1; i < n; i++) {
15         if(a[i] != a[0]) res = "NO";
16     }
17     cout << res << endl;
18 }
原文地址:https://www.cnblogs.com/qqky/p/6884715.html