C Mika with Cherry Cake
题目大意是有很多商人卖糖果,我们要从原点去找他们去买糖果,但是买完之后必须要放回原点,同时每个商人都有一个固定的方向来移动,我们的速度和商人的速度是相同的,问我们最多能买多少糖果
通过我们画图画出各种方向可以明显的看出来
向上向右的移动方向是一定不会相遇的,所以说我们只有向左向下的两个方向的商人才有可能与我们相遇
同时如果向下的距离y < x那么我们也不会与这个商人相遇
向左同理,x < y是不会与商人相遇的
我们要想得到更多的糖果,那么我们肯定就是离得越近越能接触的越多,所以对x + y进行排序
那么下一个问题就是我们怎么确定哪些是能接触到的呢,毕竟我与商人都是移动的
我们要接触到一个商人,那么我们就得去找他,这个题是用曼哈顿距离的
假设这个商人不动,因为我们的速度是相同的,所以我们去一次的时间是(x + y) / 2,回来也是,那么总时间是x + y。我们前面一共花费的时间是t,因为他是在动的,假设他向下移动,那么他此时的距离就是x + (y - t),同上面的,如果y’t < x那么也肯定不会与我们相遇,那么我们这次花费的时间就是x + (y - t),我们还要加上前面花费的时间所以就是 x + (y - t) + t = x + y,所以每次更新上一次的时间就是x + y
附上大佬的代码:
# include<bits/stdc++.h>
using namespace std;
const long long N = 1.1e6;
typedef long long ll;
ll n,m ;
//ll x1[N], y1[N], dir[N];
//ll flag[N],sum1[N];
struct A{
int x,y,f;
int value;
}ar[5010];
int cmp(A a, A b){
return a.value < b.value;
}
void result(){
cin >> n;
int ans=0;
for(int i = 0 ;i < n; ++i){
int x,y,k;
cin>>x>>y>>k;
if(k==1||k==3){
continue;
}
if(k == 2 && y - x >= 0){
ar[ans].x = x;
ar[ans].y = y;
ar[ans].f = k;
ar[ans++].value = x + y;
}
else if(k == 4 && x - y >= 0){
ar[ans].x = x;
ar[ans].y = y;
ar[ans].f = k;
ar[ans++].value = x + y;
}
}
sort(ar, ar+ans,cmp);
int t = 0 ;
int sum=0;
for(int i = 0 ; i< ans; ++i){
if(ar[i].f == 2 && ar[i].y - t >= ar[i].x){ // 往下走,
t=ar[i].x+ar[i].y;
sum++;
}
else if(ar[i].f == 4 && ar[i].x - t >= ar[i].y){
t=ar[i].x+ar[i].y;
sum++;
}
}
cout<<sum<<endl;
}
int main(){
result();
}
i].y;
sum++;
}
}
cout<<sum<<endl;
}
int main(){
result();
}