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

[编程题] 数组变换

时间限制: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 }
时间: 2024-10-19 13:47:55

数组变换--全国模拟(三)的相关文章

js之二维数组定义和初始化三种方法

方法一:直接定义并且初始化,这种遇到数量少的情况可以用 var _TheArray = [["0-1","0-2"],["1-1","1-2"],["2-1","2-2"]] 方法二:未知长度的二维数组 var tArray = new Array();   //先声明一维 for(var k=0;k<i;k++){        //一维长度为i,i为变量,可以根据实际情况改变

c语言:模拟三次密码输入。

模拟三次密码输入. 解:程序: #include<stdio.h> #include<windows.h> #include<string.h> int main() { int i; char *p = "123456"; char arr[10]; for (i = 0; i < 3; i++) { printf("请输入密码:"); scanf("%s",arr); if (strcmp(p,arr

C++动态数组简单的模拟二元堆

//C++动态数组简单的模拟二元堆 #include<iostream> using namespace std; class BinaryHeap { private: int cap; //该阵列的最大容量 int size; //当前元素个数 int* datas; //数组首地址 public: explicit BinaryHeap(int cap_) :cap(cap_), size(0) { datas = new int[cap]; } ~BinaryHeap(){ delet

【C语言】用结构体数组实现:有三个候选人,每个选民只能选一个人,编写一个选票程序,最终输出候选人的票数

//用结构体数组实现:有三个候选人,每个选民只能选一个人,编写一个选票程序,最终输出候选人的票数(假设有十个选民) #include <stdio.h> #include <stdio.h> struct Person //声明结构体 { char name[20]; int count; }leader[3]={"li",0,"zhang",0,"sun",0}; //定义结构体数组并初值化 int main() { i

Java 数组元素复制的三种方法

一.将数组元素逐个复制到目标数组中 例1 //源数组 int[] source = {10,30,20,40}; //目标数组 int[] target = new int[source.length]; for (int i = 0;i < source.length;i++){ target[i] = source[i]; } 二.使用System类的arraycopy()方法 public static void arraycopy(Object src,int srcPos,Object

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

[编程题] 变换次数 时间限制:1秒 空间限制:32768K 牛牛想对一个数做若干次变换,直到这个数只剩下一位数字. 变换的规则是:将这个数变成 所有位数上的数字的乘积.比如285经过一次变换后转化成2*8*5=80. 问题是,要做多少次变换,使得这个数变成个位数. 输入描述: 输入一个整数.小于等于2,000,000,000. 输出描述: 输出一个整数,表示变换次数. 输入例子: 285 输出例子: 2 解题思路:针对于给定的数 1)求出数的每一位,且相乘存入result中 2)一次操作后co

排序子序列--全国模拟(三)

牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的.牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列. 如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2 输入描述: 输入的第一行为一个正整数n(1 ≤ n ≤ 10^5) 第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字. 输出描述

组队竞赛--全国模拟(三)

[编程题] 组队竞赛 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值. 例如: 一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3 一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2 为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大. 如样例所示: 如果牛牛

添加字符--全国模拟(三)

[编程题] 添加字符 时间限制:1秒 空间限制:32768K 牛牛手里有一个字符串A,羊羊的手里有一个字符串B,B的长度大于等于A,所以牛牛想把A串变得和B串一样长,这样羊羊就愿意和牛牛一起玩了. 而且A的长度增加到和B串一样长的时候,对应的每一位相等的越多,羊羊就越喜欢.比如"abc"和"abd"对应相等的位数为2,为前两位. 牛牛可以在A的开头或者结尾添加任意字符,使得长度和B一样.现在问牛牛对A串添加完字符之后,不相等的位数最少有多少位? 输入描述: 第一行为