wsnの博客

记录学习经历和一点点日常

0%

热身赛Day2

Day 2

E - Expeditious Cubing

题意:

魔方比赛将魔方还原,每个人有五次机会,去掉最长的时间和最短的时间,将剩下三个时间求平均值就是该选手的成绩。别的选手已经完成五次了,小黑还差一次没有完成,所以小黑有一个目标成绩,只要最终成绩小于或等于这个目标成绩,小黑就赢得了比赛。给出小黑前四次成绩和目标成绩,如果小黑不可能获胜,就输出“impossible”;如果小黑一定能获胜就输出“infinite”;如果小黑可能获胜,则输出小黑最后一次成绩最慢是多少。

  • 所有数字都是两位小数

  • 所有数据都在1和20之间

思路:

  • 如果最后一次成绩比最快的成绩还快,那么小黑最终成绩是4个成绩里最快的三组成绩的平均值min

  • 如果最后一次成绩比最慢的成绩还慢,那么小黑最终成绩是4个成绩里最慢的三组成绩的平均值max

  • 无论最后一次成绩如何,小黑成绩在min和max之间;所以如果目标成绩小于min,则小黑一定不可能赢;如果目标成绩大于等于max,则小黑一定能赢

  • 如果目标成绩在min和max之间,则最后一次成绩至少为:目标成绩$\times3-$中间两次成绩(去除最快和最慢成绩)

  • 要注意浮点数判断,eps的使用

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
#define eps 1e-8
using namespace std;
const double pi = acos(-1.0);
int a[110];
int cmp(double a)
{
if(a>eps) return 1;
else if(a<-eps) return -1;
return 0;
}
int main()
{
double a[5];
for(int i=0;i<5;i++)
scanf("%lf",&a[i]);
sort(a,a+4);
double x=3*a[4]-a[1]-a[2];
if(cmp(x-a[0])==-1) printf("impossible\n");
else if(cmp(x-a[3])>=0) printf("infinite\n");
else printf("%.2f\n",x);
return 0;
}

I - Inverted Deck

题意:

有一组卡牌,每张卡牌有一个数字,一开始卡牌的排列是递增的。小明从中拿出了一段卡牌,又放回了原位,但是不知道方向是否放对(可能有一段逆序)。如果可以通过调整一段卡牌使卡牌恢复递增序列,就输出调整的起始点和结束点;如果不可以,就输出“impossible”。

思路:

这题的方法应该挺多的,我最终ac的方法是先用sort将序列排序,从前往后遍历找到第一个不同的点left,从后往前遍历找到第一个不同的点right。

  • 特例:如果left大于0,right小于n-1,left-1位置的数应该小于right+1位置的数,否则输出“impossible”
  • 从left遍历到right,序列应该是递减的,否则输出“impossible”
  • 如果前面都满足,输出left和right

    代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#define _CRT_SBCURE_NO_DEPRECATE
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>

using namespace std;
const double pi = acos(-1.0);
const int maxn=1e6+7;
int a[maxn];
int b[maxn];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
int left=0,right=0;
for(int i=0;i<n;i++)
{
if(a[i]!=b[i])
{
left=i;
break;
}
}
for(int i=n-1;i>=0;i--)
{
if(a[i]!=b[i])
{
right=i;
break;
}
}
int f=1;
if(left>0&&right<n-1&&a[left-1]>a[right+1])
{
//cout<<"impossible"<<endl;
f=0;
}
for(int i=left;i<right;i++)
{
if(a[i]<a[i+1])
{
//cout<<"impossible"<<endl;
f=0;
break;
}
}
if(f)
cout<<left+1<<" "<<right+1<<endl;
else
cout<<"impossible"<<endl;
return 0;
}