2731.移动机器人
题目链接
解题思路:
相撞时直接改变顺序,但是题意的相撞是重合,重合后改变方向等价于不改变 -> (1,3) -> (2, 2) -> (1, 3)
所以直接加减即可 注意的是 数据范围所以开辟一个 long long 数组 来进行操作
接下来对坐标进行排序
长度的范围为 1e5 直接双循环判断会超时,需要分解,拆开来看可以看出是一个排列组合p(a, b) 的公式
(pos[i] - pos[i - 1]) * i * (n - i)
不理解,可将各个两点距离拆开成成各个相邻两点的距离多次相加即可
java code:
class Solution {
long mod = (long) 1e9 + 7;
public int sumDistance(int[] nums, String s, int d) {
int size = nums.length;
long[] pos = new long[size];
for(int i = 0; i < size; i++){
if(s.charAt(i) == 'R') pos[i] = nums[i] + d;
else pos[i] = nums[i] - d;
}
Arrays.sort(pos);
long res = 0;
// 排列组合p公式推出有序相邻距离的个数
for(int i = 1; i < size; i++){
res = (res + (pos[i] - pos[i - 1]) * i % mod * (size - i) % mod) % mod;
}
return (int) res;
}
}
c++ code:
typedef long long LL;
class Solution {
public:
LL mod = (LL) 1e9 + 7;
int sumDistance(vector<int>& nums, string s, int d) {
int n = nums.size();
vector<LL> pos(n);
for(int i = 0; i < n; i++){
if(s[i] == 'R') pos[i] = nums[i] + d;
else pos[i] = nums[i] - d;
}
sort(pos.begin(), pos.end());
LL res = 0;
for(int i = 1; i < n; i++){
res = (res + (pos[i] - pos[i - 1]) * i % mod * (n - i) % mod) % mod;
}
return (int)res;
}
};