Advertisement

上海计算机学会2023年12月月赛C++乙组T1移动向量

阅读量:

移动向量

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定 n 个二维向量,其中第 i 个向量记作 (xi​,yi​)。每个向量对应一种移动操作,其中第 i 个向量表示将点 (s,t) 移动到 (s+xi​,t+yi​) 。

请从中挑选任意数量的向量,使得从原点出发的点,经过向量的移动之后,终点的 x 坐标的绝对值与 y 坐标的绝对值之和达到最大。

输入格式
  • 单个整数:表示 n
  • 第二行到第 n+1 行:每行两个整数 xi​ 与 yi​。
输出格式
  • 单个整数:表示终点的x坐标绝对值与y坐标绝对值之和的最大值。
数据范围
  • 对于 30% 的数据,1≤n≤20
  • 对于 60% 的数据,1≤n≤500
  • 对于 100% 的数据,1≤n≤300,000
  • −109≤xi​,yi​≤109
样例数据

输入:
4
-100 99
1 100
-1 -100
100 -99
输出:
298
说明:
(-1 -100)
(100 -99)

解析:

想要x绝对值加y绝对值最大,求最大值对于结果有四种情况

1.若结果为x正y正:那么向量只要x+y>0 即增加结果的最大值;

2.若结果为x负y负:那么向量只要x+y<0 即增加结果的最大值

3.若结果为x正y负:那么向量只要x-y>0 即增加结果的最大值

4.若结果为x负y正:那么向量只要x-y<0 即增加结果的最大值

将所有向量分别按x+y和x-y排序,然后分别计算最大值,

然后输出这四个最大值中的最大值,即为答案。

详见代码:

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 int n;
    
 int x[300005];
    
 int y[300005];
    
 long long ans1=0,ans2=0,ans3=0,ans4=0;//四个最大值
    
 int main() {
    
     cin >> n;
    
     for(int i = 1; i <= n; i++) {
    
     cin>>x[i]>>y[i];
    
     }
    
     for(int i=1;i<=n;i++){
    
     if (x[i]+y[i]>0) ans1+=x[i]+y[i];
    
     if (x[i]-y[i]>0) ans2+=x[i]-y[i];
    
     if (-x[i]+y[i]>0) ans3+=-x[i]+y[i];
    
     if (-x[i]-y[i]>0) ans4+=-x[i]-y[i];
    
     }
    
     cout<<max(max(ans1,ans2),max(ans3,ans4));//输出四个最大值中的最大值
    
     return 0;
    
 }
    
    
    
    
    AI写代码cpp
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-05-31/c8LwCQKp7gkhstUnrxSNXO4ZRYDu.png)

全部评论 (0)

还没有任何评论哟~