Codeforces Round #737 (Div. 2)
A.Ezzat and Two Subsequences
=
看完题目后,我们并不知道最优解该如何构造
然后我们观察样例及解释:
- 第一组,最终是 和
- 第二组,最终是 和
然后我们不难得到一个猜想:
将最大的数单独为一组,其余为一组
代码实现简单
至于证明,我有一个很妙的解法,但是这里太小了,写不下😆
#include<bits/stdc++.h>
#define BetterIO ios::sync_with_stdio(false)
using namespace std;
int N,A[100001];
#define int long long
main(void)
{
BetterIO;
register int Case;cin>>Case;while(Case--)
{
register int i;cin>>N;
for(i=1;i<=N;i++)cin>>A[i];
sort(A+1,A+N+1);
register int Sum=0;
for(i=1;i<N;i++)Sum+=A[i];
printf("%.9lf\n",1.0*Sum/(N-1)+1.0*A[N]);
}
return 0;
}
B.Moamen and k-subarrays
=
看完题目后,我们得到一个猜想:
只要将原串分成递增的小段即可
但是我们轻而易举地 掉了
比如说前面有一个 后面有一个 就炸掉了
于是我们稍加改进,不难得到:
只要将原串分成递增的小段且是排完序紧挨的即可
然后可以用 pair 来优化写法,于是代码不难写出
#include<bits/stdc++.h>
#define BetterIO ios::sync_with_stdio(false)
using namespace std;
int N,K,A[100001];
pair< int,int >B[100001];
int main(void)
{
BetterIO;
register int Case;cin>>Case;while(Case--)
{
register int i;cin>>N>>K;
for(i=1;i<=N;i++)cin>>A[i];
for(i=1;i<=N;i++)B[i].first=A[i],B[i].second=i;
sort(B+1,B+N+1);
register int Ans=0;
for(i=2;i<=N;i++)if(B[i].second!=B[i-1].second+1)Ans++;
if(Ans<K)puts("YES");
else puts("NO");
}
return 0;
}