2019 NWERC
E Expeditious Cubing
题意:
最终成绩为五个成绩去掉最好和最差两个成绩剩下三个成绩的平均数。
输入四个成绩和赢得比赛需要的最小最终成绩,
求他第五次成绩最差是多少时能赢得比赛,或者无论如何都能赢得比赛,或不可能赢得比赛。
代码:
#include <bits/stdc++.h>
using namespace std;
#define sep 1e-5
int cmp(double k){
if(k>sep) return 1;
else if(k<-sep) return -1;
return 0;
}
int main()
{
double a[6];
for(int i=0;i<5;i++){
cin>>a[i];
}
sort(a,a+4);
double ans;
ans=a[0]+a[1]+a[2];
if(cmp(3*a[4]-ans)==-1){
cout<<"impossible"<<endl;
return 0;
}
ans=a[1]+a[2]+a[3];
if(cmp(3*a[4]-ans)>=0){
cout<<"infinite"<<endl;
return 0;
}
ans=a[4]*3-a[1]-a[2];
printf("%.2lf",ans);
return 0;
}
I-Inverted Deck
题意:
给出n个数,若能交换其中的一段数序列使之能从小到大排列。
输出改变的左端点和右端点的下标值;否则输出-1;
思路:
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 +10;
int a[N];
int b[N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
int flag = 0;
int l=0;
int r=0;
for(int i=1;i<=n;i++){
if(a[i]!=b[i]){
l=i;
break;
}
}
for(int i=n;i>=1;i--)
{if(a[i]!=b[i]){
r=i;
break;
}
}
for(int i=l;i<r;i++){
if(a[i]<a[i+1]) flag=1;
}
if(!l&&!r) cout<<"1 1"<<endl;
else if(!flag&&l&&r){
cout<<l<<" "<<r<<endl;
}
else
cout<<"impossible"<<endl;
return 0;
}