首页 > 其他分享 >收集宝石

收集宝石

时间:2022-11-22 19:05:09浏览次数:57  
标签:宝石 收集 int 闪现 long num


收集宝石(gem)

【题目描述】

         小R来到了一个神秘的房间,这个房间的地面上散落着n颗宝石,第i颗宝石的位置为(xi,yi),价值为wi。小R想要收集这些宝石,每颗宝石有一个收集范围,第i颗宝石的收集范围为ri,当小R离这颗宝石的距离在ri以内时,小R就可以收集到这颗宝石。现在小R在坐标原点,他可以使用一次闪现技能,瞬间闪现到距离R以内的一个整点A(即这个点的横纵坐标必须是整数),然后他可以收集到在点A能够收集到的所有宝石。由于某些原因,他在使用闪现技能前不能收集宝石。小R不能闪现到房间外面,房间一个由四条直线x=-w,x=w,y=-h,y=h组成的正方形。换句话说,小R只能闪现到横坐标在[-w,w]之间,纵坐标在[-h,h]之间的整点。

         小R希望收集到尽量多的宝石,但有时他不得不放弃一些宝石,他希望你告诉他,他至少需要放弃多少价值的宝石。并且他还想知道,他放弃这些价值的宝石时,他需要闪现到哪一个点。如果有多解,输出X坐标最小的;如果有多个解X坐标相等,输出Y坐标最小的解。

【输入格式】

         第一行4个整数R, n, w, h。

         以后N行,每行四个整数,分别表示xi,yi,wi,ri

【输出格式】

         输出分为两行。

         第一行一个整数,表示小R至少需要放弃多少价值的宝石

         第二行两个整数,小R应该闪现到的坐标。

【输入样例】

5 3 5 5

3 3 4 1

4 4 5 1

0 -2 7 1

【输出样例】

7

3 4

【输入样例】

5 3 3 3

3 3 4 1

4 4 5 1

0 -2 7 1

【输出样例】

9

-1 -2

【数据范围与约定】

对于100%的数据 N<=800 0<=Limit<=10^6,0<=W<=10000,0<=H<=10^6

数据序号

N

Limit

注释

1

<=5

<=100

 

2

<=12

<=10000

3

<=100

<=10000

随机数据

4

<=400

<=10^6

5

<=800

6

<=200

<=20000

 

7

8

<=400

<=10^6

9

10

所有输入都是整数,且绝对值不超过10^6

题解:我们注意到W比较小,所以直接暴力枚举W,对于每一条线上的圆所截的线段进行离散化,求出最小值。

Code:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
int R,n,w,h,len,all,num,x[10000],y[10000],W[10000],r[10000],ans,ansx,ansy,sum;
pair<int,int>a[1000005];
int main(){
freopen("gem.in","r",stdin);
freopen("gem.out","w",stdout);
ans=-1000000000;
scanf("%d%d%d%d",&R,&n,&w,&h);
for(int i=1;i<=n;i++)scanf("%d%d%d%d",&x[i],&y[i],&W[i],&r[i]),all+=W[i];
for(int i=-w;i<=w;i++){
num=0;
for(int j=1;j<=n;j++){
if(abs(x[j]-i)>r[j])continue;
len=int(sqrt((long long)r[j]*r[j]-(long long)(x[j]-i)*(x[j]-i)));
a[++num]=make_pair(y[j]-len,W[j]);a[++num]=make_pair(y[j]+len+1,-W[j]);
}
a[++num]=make_pair(0,0);
sort(a+1,a+1+num);
sum=0;
for(int j=1;j<=num;j++){
sum+=a[j].second;
if((long long)i*i+(long long)a[j].first*a[j].first>(long long)R*R||a[j].first>h||a[j].first<-h)continue;
if(sum>ans){ans=sum;ansx=i;ansy=a[j].first;}
}
}
printf("%d\n%d %d\n",all-ans,ansx,ansy);
return 0;
}

 

标签:宝石,收集,int,闪现,long,num
From: https://blog.51cto.com/u_15888102/5878351

相关文章

  • kali 1、信息收集:recon-ng
    recon-ng:既提供了被动扫描的功能、也提供了主动扫描的功能;特别是在收集子域名以及解析子域名的IP地址时.1、打开recon-ng①命令行输入:recon-ng②菜单打开:【01-Informa......
  • innodb中统计数据是如何收集的
    ​InnoDB统计数据如何查看    1.通过SHOWTABLESTATUS可以看到关于表的统计数据    2.通过SHOWINDEX可以看到关于索引的统计数据 InnoDB提供了两种存储统计数......
  • 各厂商服务器存储默认管理口登录信息(默认IP、用户名、密码)收集
    在此收集了一些厂商的服务器存储设备的默认管理口信息,以供大家日后运维时方便查找,若有错误的地方请指正,谢谢!服务器管理口信息:存储管理口信息: 光纤交换机管理口信息:......
  • DNA germline 变异可信度判定 (证据项收集)
    2022-11-2012:09:06星期日目的原先写过一个DNAgermline变异可信度判定,描述了一套评分机制,根据几项证据项进行变异可信度的判定,但是没有对证据项的来源进行描述的讲......
  • Animator工具函数收集
    1)获取AnimationClippublicstaticboolTryGetAnimatorClip(Animatoranimator,stringclipName,outAnimationClipoutClip){varclips=animator.runtimeAn......
  • 一些有用的网站收集
    省流:1.w3school编程教程2.stackoverflowbug搜索3.tutorialspoint教程网站4.karan/Projects适合初学者的小项目5.程序员客栈程序员自由工作平台6.LintCode领......
  • #yyds干货盘点# 动态规划专题:字母收集
    1.简述:有一个  的矩形方阵,每个格子上面写了一个小写字母。小红站在矩形的左上角,她每次可以向右或者向下走,走到某个格子上就可以收集这个格子的字母。小红非常喜欢"love"......
  • CobaltStrike之信息收集
    声明:本文只是交流学习心得,如果被拿去做违法乱纪的事情,请自行负责,与作者无关CobalitStrike简称CS,是一个渗透测试的利器,它可以被分为一个服务端和多个客户端,所以可以被用来......
  • pytest文档83 - 把收集的 yaml 文件转成pytest 模块和用例
    前言前面实现了一个基础的读取yaml文件内容,当成用例去执行。虽然入门简单,但需要扩展功能,比如在yaml用例实现参数化,就不好扩展了。因为它并不是一个真正的pytest的模块......
  • pytest文档82 - 用例收集钩子 pytest_collect_file 的使用
    前言pytest提供了一个收集用例的钩子,在用例收集阶段,默认会查找test_*.py文件或者*_test.py文件。如果我们想运行一个非python的文件,比如用yaml文件写用例,那么就需要......