Sorting Trees (没什么方法~~)华中科技大的某场网络赛

链接: https://www.nowcoder.com/acm/contest/106/F
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

It’s universally acknowledged that there’re innumerable trees in the campus of HUST.

One day the tree manager of HUST asked you to sort N trees increasing by their heights a i. Because you were a warm-hearted and professional programmer, you immediately wrote the  Bubble Sort to finish the task. However, you were so tired that made a huge mistake:
for(int i=1;i<n;i++)
    for(int j=1;j<=n-i;j++)
         if(a[j+k]<a[j])swap(a[j+k],a[j]);
Usually k=1 is the normal  Bubble Sort. But you didn't type it correctly. When you now realize it, the trees have been replanted. In order to fix them you must find the first place that goes wrong, compared with the correctly sorted tree sequence.

If every trees are in their correct places then print -1. And you should know k can be equal to 1 which means you didn't make any mistake at all. Also you don't need to consider the part j+k beyond n.

输入描述:

 
 
The first line contains two integers N and K as described above.
Then the next line are N integers indicating the unsorted trees.

输出描述:

A integer in a single line, indicating the first place that goes wrong. Or -1 means no mistake.

                    本来是如果暴力再对比的话~~是n^2的时间~肯定会超时~那么怎么来做呢

                    其实他说这是正常的冒泡排序~~开始和真正的是不一样的~~他的样例排序顺序::第一遍会排 2 3 1 4 5~~第二遍会排::1 3 2 4~~第三遍会排 1 3 2~~所以发现了吗~~我们的冒泡是增大初始点~~而他是缩小终点~~所以排序一次后的其他排序不会产生影响~~

#include<iostream>
#include<algorithm>
using namespace std;
int a[100005], b[100005];
int main()
{
	int n, k;
	scanf("%d%d", &n, &k);
	for (int s = 0; s < n; s++)
	{
		scanf("%d", &a[s]);
		b[s] = a[s];
	}
	if (k == 1)
	{
		printf("-1\n");
		return 0;
	}
	sort(b, b + n);
	for (int s = 0; (s + k < n); s++)
	{
		if (a[s + k] < a[s])
		{
			swap(a[s], a[s + k]);
		}
	}
	int ans = -1;
	for (int s = 0; s < n; s++)
	{
		if (a[s] != b[s])
		{
			ans = s+1;
			break;
		}
	}
	cout << ans << endl;
	return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值