题解:P15002 [UOI 2019 II Stage] 重大发现

· · 题解

我们可以手推一下旋转后每个数到达的位置。

不旋转(旋转零次):

A B
C D

公式:A \cdot (B + C - D)

旋转一次:

C A
D B

公式:C \cdot (A + D - B)

旋转两次:

D C
B A

公式:D \cdot (C + B - A)

旋转三次:

B D
A C

公式:B \cdot (D + A - C)

题目要求输出为了使石板的重要性达到最大,最小的旋转次数,所以我们可以用一个结构体存储重要性和旋转次数,然后按照重要性降序排序(为了使第一个元素重要性尽可能高),重要性相同的按照旋转次数升序排序(为了保证输出的次数是最少的),第一个元素的旋转次数就是我们要找的次数。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ft first
#define sd second
#define fs(i,x,y) for(int i=(x);i<=(y);i++)
#define fj(i,x,y) for(int i=(x);i>=(y);i--)
struct Node{
    int x,i;
}node[5];
bool cmp(Node a,Node b){
    if(a.x>b.x)return 1;
    else if(a.x==b.x&&a.i<b.i)return 1;
    return 0;
}
signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0); 
    cout.tie(0);
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    node[0]={a*(b+c-d),0};
    node[1]={c*(a+d-b),1};
    node[2]={d*(c+b-a),2};
    node[3]={b*(d+a-c),3};
    sort(node,node+4,cmp);
    cout<<node[0].i;
    return 0;
}