题解:P15002 [UOI 2019 II Stage] 重大发现
我们可以手推一下旋转后每个数到达的位置。
不旋转(旋转零次):
公式:
旋转一次:
公式:
旋转两次:
公式:
旋转三次:
公式:
题目要求输出为了使石板的重要性达到最大,最小的旋转次数,所以我们可以用一个结构体存储重要性和旋转次数,然后按照重要性降序排序(为了使第一个元素重要性尽可能高),重要性相同的按照旋转次数升序排序(为了保证输出的次数是最少的),第一个元素的旋转次数就是我们要找的次数。
代码
#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;
}