目录
A-Problem - A - Codeforces
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+10;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main() {
int t,n;
ll a[N];
t=read();
while (t--){
n=read();
for(int i=0;i<n;i++){
a[i]=read();
}
sort(a,a+n);
double sum=0.0;
for(int i=0;i<n-1;i++)sum+=a[i];
printf("%.9lf\n",sum/(n-1)+a[n-1]);
}
}
B-Problem - B - Codeforces
思路:需要在给定的数组中找出一段子数组,这个子数组必须是升序排序的,并且是连续的(也就是说子数组之外没有数字能插进去,使得该子数组仍按升序排序)
#include <bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<int,int> pr;
const int N = 1e5+10;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main() {
int t,n,k,a;
t=read();
while (t--){
n=read(),k=read();
vector<pr>v;//v的键存储数组元素,值存储元素的位置
for(int i=0;i<n;i++){
a=read();
v.push_back(pr(a,i));
}
sort(v.begin(),v.end());//对键升序排序
int ans=1;
for(int i=0;i<n-1;i++){
if(v[i].second!=v[i+1].second-1)ans++;
//当v[i].second=v[i+1].second-1时,说明排序前两个元素相邻,并且后大前小
//即排序并没有改变二者的前后位置,并且没有元素插到他们两个之间。
//满足条件,这两个元素可以归为一个小的subarray
}
if(ans<=k)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
C就整不明白了唉。。。