第十一届山东省大学生程序设计竞赛(热身赛)C题

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();
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值