div2. #722 B

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了div2. #722 B相关的知识,希望对你有一定的参考价值。

B. Sifid and Strange Subsequences

A sequence (b1,b2,…,bk) is called strange, if the absolute difference between any pair of its elements is greater than or equal to the maximum element in the sequence. Formally speaking, it’s strange if for every pair (i,j) with 1≤i<j≤k, we have |ai−aj|≥MAX, where MAX is the largest element of the sequence. In particular, any sequence of length at most 1 is strange.

For example, the sequences (−2021,−1,−1,−1) and (−1,0,1) are strange, but (3,0,1) is not, because |0−1|<3.

Sifid has an array a of n integers. Sifid likes everything big, so among all the strange subsequences of a, he wants to find the length of the longest one. Can you help him?

A sequence c is a subsequence of an array d if c can be obtained from d by deletion of several (possibly, zero or all) elements.

Input
The first line contains an integer t (1≤t≤104) — the number of test cases. The description of the test cases follows.

The first line of each test case contains an integer n (1≤n≤105) — the length of the array a.

The second line of each test case contains n integers a1,a2,…,an (−109≤ai≤109) — the elements of the array a.

It is guaranteed that the sum of n over all test cases doesn’t exceed 105.

Output
For each test case output a single integer — the length of the longest strange subsequence of a.

Example
inputCopy
6
4
-1 -2 0 0
7
-3 4 -2 0 -4 6 1
5
0 5 -3 2 -5
3
2 3 1
4
-3 0 2 0
6
-3 -2 -1 1 1 1
outputCopy
4
5
4
1
3
4
Note
In the first test case, one of the longest strange subsequences is (a1,a2,a3,a4)
In the second test case, one of the longest strange subsequences is (a1,a3,a4,a5,a7).

In the third test case, one of the longest strange subsequences is (a1,a3,a4,a5).

In the fourth test case, one of the longest strange subsequences is (a2).

In the fifth test case, one of the longest strange subsequences is (a1,a2,a4).

题意:从一个数组中找到子序列,这个序列中任意两项差值的绝对值大于子序列钟最大值,输出子序列最大多少。

思路:
1.明确肯定包含小于等于0的元素,由于绝对值的原因。
2.序列中不可能出现两个正数。
3.找一个正数小于等于非负数任意两项差值的绝对值的最小值。

自己刚开始写的超时代码:(没想到用排序)

#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,g=1,cnt=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]<=0)
            {
                b[g++]=a[i];
            }
        }
    g-=1;
    if(g==0)
    {
        cout<<1<<endl;
        continue;
    }
    if(g==n)
    {
        cout<<n<<endl;
        continue;
    }
    int minn=1000000;
   for(int i=1;i<=g;i++)
   {
       for(int j=i+1;j<=g;j++)
        minn=min(minn,abs(b[j]-b[i]));
   }
   cnt=g;
   for(int i=1;i<=n;i++)
   {
       if(a[i]>0&&minn>=a[i])
        {cnt++;break;}
   }
   cout<<cnt<<endl;

    }
    return 0;
}

排序后的优化代码:

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
void solve(){
	int n;
	cin>>n;
	int a[n];
	int count=0;
	int mini=inf;
	for(int i =0;i<n;i++){
		cin>>a[i];
		if(a[i]<=0) 
            count ++;
		else 
            mini = min(mini,a[i]);
	}
	sort(a,a+n);
	int min1=inf;
	for(int i =0;i<n;i++){
		if((i+1)<n&&a[i+1]<=0) 
            min1=min(min1,(a[i+1]-a[i]));
	}
	if(min1>=mini) count++;
	cout<<count<<endl;
	return;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

菜了好多…

以上是关于div2. #722 B的主要内容,如果未能解决你的问题,请参考以下文章

codeforces722B

Codeforces Round 609 Div2

Codeforces Round #722 (Div. 2)- B.Sifid and Strange Subsequences - 前缀

Codeforces Round #394 div2

codeforces 19/10/26 div2E.Rock In Push

CF#345 div2 A\B\C题