Lost Cows POJ 2182 思维+巧法

Lost Cows POJ 2182 思维

题意

是说有n头牛,它们身高不一但是排成了一队,从左到右编号为1到n,现在告诉你从第二号开始前面的那些牛中身高小于它的个数,一共有n-1个数。然后求出它们按照身高来排序的话从低到高编号会是多少。

解题思路

首先我们需要从它给的数据逆序来进行处理,为什么,比如倒数第一个数据是0的话,说明前面没有比它矮的牛,那么它的编号就是1,然后倒数第二个是2的话,就是说前面有两个比它矮,因为1号已经有了,所以他就是4号,后面以此类推。

根据这个思路我们就可以进行模拟(或者说暴力来进行解决),当然也可以使用线段树或则树状数组来进行优化。

这里还有一种算法,是基于冒泡排序的,是hxr大哥想到的,真是tql。

代码实现

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=8e5+7;
int a[maxn], vis[maxn];
int n;
int main()
{
    scanf("%d", &n);
    for(int i=2; i<=n; i++)
    {
        scanf("%d", &a[i]);
    }
    int t;
    for(int i=n; i>=1; i--)
    {
        t=a[i]+1;
        for(int j=1; j<=t; j++) //这是在剩下的数中查找第t小的数
        {
            if(vis[j]==1)
                t++;
        }
        a[i]=t;
        vis[t]=1;
    }
    for(int i=1; i<=n; i++)
    {
        printf("%d\n", a[i]);
    }
    return 0;
 } 

冒泡排序法

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream> 
using namespace std;
const int maxn=8e3+7;
int a[maxn], id[maxn];
int num[maxn];
int n;
int main()
{
    cin>>n;
    a[1]=0;
    id[1]=1;
    for(int i=2; i<=n; i++)
    {
        cin>>a[i];
        id[i]=i;
    }
    for(int j=1; j<n; j++)
    {
        for(int i=1; i<n; i++)
        {
            if(a[i]>=a[i+1])
            {
                a[i]++;
                swap(a[i], a[i+1] );
                swap(id[i], id[i+1]);
                //for(int t=1; t<=n; t++) cout<<a[t]<<" "; cout<<"\n";
                //for(int t=1; t<=n; t++) cout<<id[t]<<" "; cout<<"\n";
                //system("pause");
            }
            
        }
    }
    for(int i=1; i<=n; i++)
        num[id[i]]=i;
    for(int i=1; i<=n; i++)
    {
        cout<<num[i]<<endl;
    }
    
    return 0;
 } 

转载于:https://www.cnblogs.com/alking1001/p/11415748.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值