Time Limit: 1 Sec Memory Limit: 128 MB
Description
给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
Input
共2行:
第1行为 N;
第2行为 N 个正整数,其间用空格间隔。
Output
增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。
Sample Input Sample Output
10 1,3,5,7,9
1 3 2 6 5 4 9 8 7 10
Ways of Solving a Problem
首先我们先审题, 题目中有两个关键词分别为:“奇数” 、 “单增” 与 “升序”;
我猜大家应该都知道何为“奇数”;
那何为 “单增”,何为 “升序”呢?
“单增”的意思:如果说在某个区间内函数与自变量呈一定的变化趋势,就说这个函数具有单调性.说得通俗一点,若在这一区间内函数随着自变量的增大而增大,则函数在这一区内就叫做关于自变量的单调递增函数,简称单增;
“升序”的意思:按从小到大的顺序排。
我们先定义一个升序队列(优先队列)
代码如下:
priority_queue <int,vector<int>,greater<int> > q;
接着,我们再定义一个判断一个数是否为奇数的函数 check(bool类型)
代码如下:
bool check(int n)
{
if(n % 2 != 0)
{
return true;
}
else
{
return false;
}
}
然后,我们将已经排好序的数导入一个数组 odd
代码如下:
for(int i = 0; i < y; i++)
{
if(!q.empty())
{
odd[i] = q.top();
q.pop();
}
}
注:
y 为队列 q 的长度。
最后这题之难处在于输出,因为数据之间以逗号间隔,所以最后最后一个数要单独输出;
代码如下:
for(int i = 0; i < y - 1; i++)
{
cout << odd[i] << ",";
}
cout << odd[y - 1];
Above All, 来看看整体的代码
#include<bits/stdc++.h>
using namespace std;
priority_queue <int,vector<int>,greater<int> > q;
bool check(int n)
{
if(n % 2 != 0)
{
return true;
}
else
{
return false;
}
}
int main()
{
int n;
cin >> n;
int x;
int odd[n];
for (int i = 0; i < n; i++)
{
cin >> x;
if(check(x))
{
q.push(x);
}
else
{
continue;
}
}
int y;
y = q.size();
for(int i = 0; i < y; i++)
{
if(!q.empty())
{
odd[i] = q.top();
q.pop();
}
}
for(int i = 0; i < y - 1; i++)
{
cout << odd[i] << ",";
}
cout << odd[y - 1];
return 0;
}