AtcoderABC246场

#A - Four PointsA - Four Points

在这里插入图片描述在这里插入图片描述

题目大意

在平面上有一个矩形,矩形的每条边都平行于x轴或y轴,并且它的面积不为零。
给定这个矩形三个顶点的坐标 (x1, y1), (x2, y2), (x3, y3),找到另外一个顶点的坐标。

思路分析

根据矩形的性质可以通过判断顶点的横坐标和纵坐标来确定另外一个顶点的坐标。

时间复杂度

O(1)

可AC代码

#include <iostream>
using namespace std;

int main(void)
{
  int x_1, x_2, x_3, y_1, y_2, y_3, x_ans, y_ans;
  
  cin >> x_1 >> y_1;
  cin >> x_2 >> y_2;  
  cin >> x_3 >> y_3;
  
  if(x_1 == x_2) x_ans = x_3;
  if(x_2 == x_3) x_ans = x_1;  
  if(x_3 == x_1) x_ans = x_2;  
  
  if(y_1 == y_2) y_ans = y_3;
  if(y_2 == y_3) y_ans = y_1;  
  if(y_3 == y_1) y_ans = y_2;
  
  cout << x_ans << " " << y_ans << endl;
  
  return 0;
}

B - Get CloserB - Get Closer

在这里插入图片描述加粗样式

题目大意

要求在二维平面上从点(0,0)出发,向点(A,B)移动距离为1的距离,然后求移动后的坐标。

思路分析

首先可以根据两点之间的距离公式来求出距离d,其中d = sqrt(A^2 + B^2)。然后可以将坐标(A,B)除以d得到新的坐标(x,y),即(x,y) = (A/d, B/d)。这样就得到了移动后的坐标

时间复杂度

O(1)

可AC代码

#include <iostream>
#include <cmath>

int main() {
    int A, B;
    std::cin >> A >> B;

    double d = std::sqrt(A * A + B * B);
    double x = A / d;
    double y = B / d;

    std::cout << x << " " << y << std::endl;

    return 0;
}

C - CouponC - Coupon

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意

购物问题。有N个商品,在商店里出售。每个商品的价格分别为A1, A2, …, AN。Takahashi有K张优惠券,每张优惠券可以用于一件商品。对于每件商品,你可以使用任意数量的优惠券(包括零张)。使用k张优惠券在价格为a日元的商品上,可以以max(a - kX, 0)日元的价格购买它。现在需要计算Takahashi购买所有商品所需的最小金额。

思路分析

首先,可以使用尽可能多的类型1优惠券,即将优惠券应用于能够带来更大降价的商品上。具体操作如下:首先统计能够使用类型1优惠券的次数m,即对于每个商品,通过将商品价格除以X取整获得能够使用的优惠券数量,然后找到实际可用的优惠券数量m和K中的较小值。接着,将m个优惠券应用于商品,从总成本中减去m*X的金额。然后,对于仍未使用完的优惠券,将使用类型2优惠券,即选择当前价格最高的商品进行折扣。最后,将剩余的优惠券使用完或者商品遍历完后,输出最终的总成本。

知识点标签

  • 数学运算
  • 排序算法

时间复杂度

O(NlogN)

可AC代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

ll n, k, x;
ll a[200005];

int main(void)
{
  
  cin >> n >> k >> x;
  for(int i = 1; i <= n; i++) cin >> a[i];
  // 初始化总成本为0
  ll ans = 0;
  // 计算总成本,即将所有商品的价格累加到ans中
  for(int i = 1; i <= n; i++) ans += a[i];

  // 定义变量m记录可用的类型1优惠券数量,初始化为0
  ll m = 0;
  
  // 根据题意,对于每个商品,通过将商品价格除以X取整获得能够使用的优惠券数量,并累加到m中
  for(int i = 1; i <= n; i++) m += a[i]/x;
  
  // 将实际可用的优惠券数量m和K中的较小值赋值给m
  m = min(m, k);
  
  // 从总成本中减去应用类型1优惠券后的金额,即减去m*X
  ans -= m*x;
  
  // 更新剩余可用的优惠券数量k
  k -= m;
  
  // 对于每个商品,计算其使用类型1优惠券后的价格
  for(int i = 1; i <= n; i++) a[i] %= x;
  
  // 对商品价格进行排序,以便后续应用类型2优惠券
  sort(a+1, a+n+1);
  
  // 从价格最高的商品开始,将剩余的优惠券应用于类型2优惠券,即选择当前价格最高的商品进行折扣
  for(int i = n; i >= 1; i--){
    if(k == 0) break;
    
    // 将当前商品的价格从总成本中减去
    ans -= a[i];
    
    // 更新剩余可用的优惠券数量k
    k--;
  }
  
  // 输出最终的总成本
  cout << ans << endl;
  
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值