栗酱的文明2

本文介绍了一种算法,用于在一个文明游戏中找到最多数量的国家,使得它们之间可以互相建立外交关系,基于每个国家的土地数量进行排序并计算满足条件的国家对数。
摘要由CSDN通过智能技术生成

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

        “伟大的勇栗兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您。您骑着威风凛凛的小白兔,带领栗子们奋勇前行。伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,
冲在每场战争的前线——无论您在哪里,他们都能找到您。骑小白兔飞驰吧,凶猛的女王,但愿您有真正的朋友和软弱的敌人。”
今天,冰雪聪明的栗酱终于玩到了她梦寐很久的文明游戏。
不过作为一个萌新,兔头獐脑的栗酱自然不愿意第一次玩就遇到一个尴尬的结局,于是希望通过你来寻找一个完美结局。

已知游戏结束前场上有n个国家,第i个国家有ai块土地,任意2个国家若是想建立外交关系,则需要互相在对方的一块土地上建立一个大使馆。
一块土地只能建立一个大使馆,若一个国家和其他国家存在外交关系,则需要征用一块己方土地作为备用大使馆。
完美结局的定义是:找到最多数量的国家,使他们相互之间存在外交关系。

输入描述:

 

第一行一个数T,表示有T组数据。

对于每组数据,第一行输入一个数n,表示国家的数量,接下来一行输入n个数,a1,a2,…,an,其中ai表示第i个国家拥有的土地数量。每两个相邻的数之间用空格隔开。

输出描述:

对于每一个询问,输出一个数,即完美结局下,相互建立外交关系的国家数量。

示例1

输入

2
5
2 2 2 2 2
10
8 6 5 9 2 7 10 3 3 9

输出

2
6

说明

对于第一个样例:
最多只能找到2个国家,使他们互相建立外交关系。
对于第二个样例:
第1,2,4,6,7,10个国家间可互相建立外交关系,最多数量为6。 

备注:,

T≤10
1≤n≤1000
1≤ai≤n

排序用了快排,数字越大越说明土地越多,越能建立,所以要实现一个降序排序。

如果有三个国家那么他们三个之间都要相互建立关系。那么第三个至少有两个土地

建立一个循环从1开始,当循环为1的时候,c[i]是最大值,当循环为2的时候,如果c[i]<2,那说明第个国家只有1块土地,sum=1,则它只能和第一块土地建立外交关系。然后依次类推,就会理解他的规则。

#include<stdio.h>
void swap(int *a,int *b)
{
    int t;
    t=*a;
    *a=*b;
    *b=t;
    
}
void QuickSort(int a[],int start,int end)
{
    if(start>=end)
    {
        return ;
    }
    int te=a[start];
    int i=start;
    int j=end;
    while(i<j)
    {
        while(i<j&&a[j]>=te) j--;
        while(i<j&&a[i]<=te) i++;
        if(i<j)
        {
            swap(&a[i],&a[j]);
        }
    }
    swap(&a[start],&a[j]);
    QuickSort(a,start,i-1);
    QuickSort(a,i+1,end);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
    int n;
    int a[1000];
    int c[1000];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    QuickSort(a,0,n-1);//从大到小排序
    for(int i=0;i<n;i++)
    {
        c[i]=a[n-i-1];
    }
    int sum=0;
        int t;
    for(int i=1;i<=n;i++)
    {
        if(c[i-1]<i)
        {
            sum=i-1;
            break;
        }
    }
        printf("%d \n",sum);
    
  
}

}



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值