[编程题] 数组变换
时间限制: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 }