Codeforces Round #722 (Div. 2)
A. Eshag Loves Big Arrays
Example
input
3
6
1 1 1 2 2 3
6
9 9 9 9 9 9
6
6 4 1 1 4 1
output
3
0
3
题目大意:
给一个数组,让你选几个元素,然后删掉比这几个元素平均值大的元素。求最多你能删掉的元素个数。
思路:
贪心,直接选择最小的数,然后不等于这个的数全部删掉。
代码:
#include<algorithm>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+7;
int a[N];
signed main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;++i)
{
cin>>a[i];
}
sort(a,a+n);
int num=a[0];
int ans=0;
for(int i=0;i<n;++i)
{
if(a[i]!=num)++ans;
}
cout<<ans<<endl;
}
return 0;
}
B. Sifid and Strange Subsequences
Example
input
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
output
4
5
4
1
3
4
题目大意:
给一个数组,求最长子数组,且它每个数作差的绝对值一定要大于或等于全部数字中的最大值。
思路:
观察样例,我们发现被删去的总是原来数组里的最大值,确实,只要尽可能的把最大值删去,就越可能符合要求。
要符合要求,就得让 最近的每对数的差尽量大,最大值尽量小。所以我们先升序排序,这样相邻的数字就是最近的,自然最后一个数字就是最大值。所以我们O(n)遍历,只要不符合,就舍去最大,让其等于次大。
代码:
#include<algorithm>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+7;
int a[N];
signed main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;++i)
{
cin>>a[i];
}
sort(a,a+n);
int k=n-1;//最大值的位置
int Max=a[k];
int ans=0;
for(int i=0;i<k;++i)
{
if(abs(a[i]-a[i+1])>=Max)
{
++ans;
}
else
{
Max=a[--k];
--i;
}
}
cout<<ans+1<<endl;
}
return 0;
}
C待补充
D. Kavi on Pairing Duty
Examples
input
1
output
1
input
2
output
3
input
3
output
6
input
100
output
688750769
思路:
看n等于3时,可以把情况分为两种,一种是 存在一个包含关系,另一种则是相反的情况。
1.先考虑有包含时,比如上面那幅图,第2,3,5行,其实就是当n=2时的情况之数,再看第4行,其实就是n=1时的情况之数。
2.看第1行和第6行,红色的线占了1格和3格,其实就是有n的约数个情况。
代码:
#include<iostream>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e6+7;
void fastio(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);}
const int MOD=998244353;
int a[N],b[N]={0,1};
signed main()
{
fastio();
int n;
cin>>n;
for(int i=1;i<=n;++i)//倍数法求约数个数
{
for(int j=1;j*i<=n;++j)
{
a[j*i]++;
}
}
for(int i=2;i<=n;++i)
{
b[i]=(a[i]+(2*b[i-1])%MOD)%MOD;
}
cout<<(b[n]-b[n-1]+MOD)%MOD<<endl;
return 0;
}
有些地方可能没讲清楚,看看能不能给一些启发吧。