BJTU1820 懒羊羊的作业
题目:
看过国产动画片的同学都知道,懒羊羊是一只非常懒的羊,整天除了吃就是睡,根本没有时间做作业。明天就是周一了,村长慢羊羊留的作业:
把 𝑛
n
个整数从大到小排序,它还没开始写,真是一件让羊悲伤的事呀。但是,懒羊羊又是一只相当“机智”的羊,它发现村长年纪大了,这么多作业根本判不过来,只会检查作业的开头和结尾。所以懒羊羊想出了一个办法:把最大的数和第一个数交换,再把最小的数与最后一个数交换,其他的数位置不变。按这种方法得到的整数数列就可以瞒过村长啦。但是即使这样,懒羊羊也懒得去做,所以它来求助爱编程的你们啦。
输入数据:
第一行为 𝑇,表示有 𝑇 (1≤𝑇≤50)组数据。接下来 𝑇 行,每行第一个整数 𝑛 (2≤𝑛≤10 000),表示共有 𝑛 个整数。之后这一行还有 𝑛 个整数,是要进行上述操作的 𝑛 个数。(保证这 𝑛 个数中最大的数只有一个,最小的数也只有一个)
输出数据:
输出共有 𝑇 行,第 𝑥 行开头为 Case x: 和一个空格,接下来为 𝑛 个数,是你的结果。
样例输入:
2
5 2 3 1 5 4
6 9 11 2 0 7 2
样例输出:
Case 1: 5 3 4 2 1
Case 2: 11 9 2 2 7 0
分析:
是到执行水题。。。。可是我连水题都做不对了(可恶😠,其实思路很简单,多考虑一下最小元素位置为数组第一个的时候,这时候需要将nmin改为nmax的位置(在最大值与第一个元素交换后)。
但是这不是卡住我的地方。我的思路没有问题以至于我一度怀疑是不是输出形式错了。然后我仔细读了读题,发现并没有给出每组数据的最大值,我恍然大悟,立刻将自己定义的max和min分别赋值成更小和更大的数如下所示:
int max = 0x80000000;
int min = 0x3f3f3f3f;
于是就ac了。。
全部代码如下:
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int main()
{
int T;
int m;
cin>>T;
m = T;
while(T--)
{
int n = 0;
int max = 0x80000000;
int nmax = 0;
int min = 0x3f3f3f3f;
int nmin = 0;
int a[10001];
memset(a,0,sizeof(a));
cin>>n;
for(int i = 0;i < n;i++)
{
cin>>a[i];
if(a[i] > max)
{
max = a[i];
nmax = i;
}
if(a[i] < min)
{
min = a[i];
nmin = i;
}
}
int temp = 0;
temp = a[0];
a[0] = a[nmax];
a[nmax] = temp;
if(nmin == 0)
{
nmin = nmax;
}
temp = a[n-1];
a[n-1] = a[nmin];
a[nmin] = temp;
cout<<"Case "<<m-T<<":";
for(int i = 0;i < n;i++)
{
cout<<" "<<a[i];
}
cout<<endl;
}
return 0;
}