启智树提高组day4T1 T1(t1.cpp,1s,512MB)

题面描述

对⼀个⻓度为2n 的实数序列A考虑下列问题:

设S为序列中所有元素的和。你可以做下列操作n次:

  • 选择两个未被选中过的下标i和j,要求i≠j ;
  • 将 Ai变为不超过Ai的最⼤整数,即将 Ai向下取整;
  • 将Aj变为不小于Aj的最小整数,即将Aj向上取整。

要求操作完成之后,新的序列中所有元素之和S'和S的差的绝对值尽量小。

现在给你⼀个⻓度为m的实数序列B,有Q组询问。每组询问要求将这个序列的⼀个区间作为上述问题中的A求解。

输入格式

第⼀⾏两个正整数m ,Q 。第⼆⾏ m个 0到 10^4之间的实数Ai ,每个实数都恰好保留了三位小数。

然后Q⾏,每⾏两个正整数Li,Ri ,表⽰此次需要求解的区间为[Li,Ri] ,保证。

输出格式

Q⾏,每⾏⼀个实数,保留三位小数,表⽰此次询问中 和 的差的绝对值可能取到的最小值。

样例输入

样例输出

样例解释

数据范围

解题思路

我的基本想法

输入这个数组,记录每个数字的小数部分;

取出并复制其需要区间

排序,但是要先去掉小数区间为0的,因为零的话既可以向上取整,也可以向下取整

一个循环,循环区间中不为0 的数字的个数的一半。每次循环时取出一个最小值和最大值;

但是如果这时,最小值>0.5的话就要考虑使用0来补位。最大值同理。

 1 while(li<=ri)
2
3 {
4
5 if(range[li]>0.5&&zero) li--,zero--;
6
7 else{
8
9 ans-=range[li];
10
11 // cout<<"ans+="<<range[li]<<endl;
12
13 }
14
15 if(range[ri]<=0.5&&zero) ri++,zero--;
16
17 else{
18
19 ans+=1-range[ri];
20
21 // cout<<"ans+=1-"<<range[ri]<<endl;
22
23 }
24
25 li++;
26
27 ri--;
28
29 }

Code

 1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<iomanip>
7 #include<map>
8 #include<set>
9 #include<queue>
10 #include<vector>
11 #define IL inline
12 #define re register
13 #define LL long long
14 #define ULL unsigned long long
15 using namespace std;
16
17 template<class T>inline void read(T&x)
18 {
19 char ch=getchar();
20 while(!isdigit(ch))ch=getchar();
21 x=ch-'0';ch=getchar();
22 while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
23 }
24 int G[55];
25 template<class T>inline void write(T x)
26
27 {
28 int g=0;
29 do{G[++g]=x%10;x/=10;}while(x);
30 for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
31 }
32
33 double a[500000],m[500000];
34 int M,Q;
35 vector<double>range;
36 double ans;
37 int main()
38 {
39 cin>>M>>Q;
40 for(re int i=1;i<=M;i++) cin>>a[i],m[i]=a[i]-floor(a[i]);
41 int l,r;
42 while(Q--)
43 {
44 read(l),read(r);
45 range.clear();
46 ans=0;
47 int zero=0;
48 for(re int i=l;i<=r;i++) if(m[i]) range.push_back(m[i]); else zero++;
49 sort(range.begin(),range.end());
50 re int li=0,ri=range.size()-1;
51 while(li<=ri)
52 {
53 if(range[li]>0.5&&zero) li--,zero--;
54 else{
55 ans-=range[li];
56 // cout<<"ans+="<<range[li]<<endl;
57 }
58 if(range[ri]<=0.5&&zero) ri++,zero--;
59 else{
60 ans+=1-range[ri];
61 // cout<<"ans+=1-"<<range[ri]<<endl;
62 }
63 li++;
64 ri--;
65 }
66
67 cout<<fixed<<setprecision(3)<<fabs(ans)<<endl;
68 }
69 return 0;
70 }

暴力

提交的时候,忘记去除调试信息……啊啊啊啊啊啊……

当然,这是暴力,10分吧。

正解

观察暴力,可以发现,一段区间的S’只和实数和,下取整和,上取整和有关系

所以我们只要给三种(实数,下取整小数,上取整小数)搞一个前缀和就好。

Code

 1 #include<bits/stdc++.h>
2 using namespace std;
3 template<class T>inline void read(T&x)
4 {
5 char ch=getchar();
6 while(!isdigit(ch))ch=getchar();
7 x=ch-'0';ch=getchar();
8 while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
9 }
10 int G[55];
11 template<class T>inline void write(T x)
12
13 {
14 int g=0;
15 do{G[++g]=x%10;x/=10;}while(x);
16 for(int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
17 }
18 int N,q,c[1<<19];double t[1<<19],s[1<<19];
19 int main(){
20 scanf("%d%d",&N,&q);
21 for(int i=1;i<=N;i++){
22 double x;
23 scanf("%lf",&x),s[i]=s[i-1]+x,t[i]=t[i-1]+ceil(x);
24 c[i]=c[i-1]+(floor(x)!=ceil(x));
25 }
26 while(q--){
27 int l,r;read(l),read(r);
28 int n=r-l+1>>1,cnt=c[r]-c[l-1];
29 double tot=s[r]-s[l-1],tt=t[r]-t[l-1];//取出这一部分的和
30 if(tt-min(cnt,n)>tot) tt-=min(cnt,n);
31 else{
32 int v=min({cnt,n,int(tt-tot+.5-1e-8)}),t=n-v;
33 tt-=v;
34 if(2*n-cnt<t) tt-=t-(2*n-cnt);
35 }
36 printf("%.3lf\n",abs(tt-tot));
37 }
38 return 0;
39 }

小结

提交时去除调试信息

启智树提高组day4T1 T1(t1.cpp,1s,512MB)的更多相关文章

  1. 【2020.11.28提高组模拟】T1染色(color)

    [2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...

  2. 暑假提高组集训Day1 T1

    说实话,今天的题真的有点难! ~备受打击~ 我们先来看一看第一题吧 看起来好像不太简单,其实并不难 下面来提供两种方法吧 1.做法一 //签到题 /* 那么这一题就是告诉你n个点的坐标,把它们分别放到 ...

  3. 【NOIP2016提高组】 Day2 T1 组合数问题

    题目传送门:https://www.luogu.org/problemnew/show/P2822                 ↓题目大意↓ 数据的极限范围:n,m≤2000,k≤21,数据组数≤ ...

  4. 【NOIP2015提高组】Day2 T1 跳石头

    题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从 ...

  5. 【NOIP2015提高组】Day1 t1神奇的幻方

    一大淼题,直接瞎搞即可,不过一定要仔细看题目给定的条件. #include<iostream> #include<cstdio> #include<cstring> ...

  6. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  7. JZOJ2020年8月11日提高组T1 密码

    JZOJ2020年8月11日提高组T1 密码 题目 Description 在浩浩茫茫的苍穹深处,住着上帝和他的神仆们,他们闲谈着下界的凡人俗事,对人世间表现的聪明智慧,大加赞赏.今天他们正在观赏大地 ...

  8. 【GDKOI2014】JZOJ2020年8月13日提高组T1 阶乘

    [GDKOI2014]JZOJ2020年8月13日提高组T1 阶乘 题目 Description Input 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和bas ...

  9. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  10. 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃

    [NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...

随机推荐

  1. 使用word模板的科研论文编写

    编写SCD论文等的时候,可能出现官网的论文模板不够全面.一般我们使用latex作为论文编写模板,格式等都方便控制和编写,而word模板操作起来较为复杂.但是官网有些时候可能找不到latex的模板内容, ...

  2. 批量操作DB

    批量操作DB 记录一次批量操作数据库,sqlServer服务器参数过多问题. 1.案例引入 对接另一个批发系统B,B需要把订单那些数据弄到系统A中.就是一个批量插入,批量更新的问题.系统保密需要,本文 ...

  3. 【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句

    问题描述 在处理一个数据收集工作任务上,收集到的数据内容格式都不能直接对应到数据库中的表格内容. 比如: 第一种情况:服务名作为第一列内容,然后之后每一列为一个人名,1:代表此人拥有这个服务,0:代表 ...

  4. 配置win + ubuntu双系统需要注意的一些点

    配置win + ubuntu双系统需要注意的一些点 基本上是按照B站机器人工匠阿杰的视频来的,但是有一些需要注意的点值得关注. 关闭RST 首先是比较新的电脑bios里会有一个叫做英特尔 快速存储技术 ...

  5. RabbitMQ集群部署(一)——单机模式部署

    本文分享自天翼云开发者社区<RabbitMQ集群部署(一)--单机模式部署>,作者:芋泥麻薯 RabbitMQ是一种开源消息队列系统,是AMQP的标准实现,用erlang语言开发.Rabb ...

  6. 【JVM之内存与垃圾回收篇】垃圾回收相关概念

    垃圾回收相关概念 System.gc() 的理解 在默认情况下,通过 System.gc() 或者 Runtime.getRuntime().gc() 的调用,会显式触发 FullGC,同时对新生代. ...

  7. Asp.net mvc基础(八)Layout页面的使用

    Layout页面相当于母版页. 使用步骤如下: 1.创建MVC5布局页 @RenderBody()渲染正文部分 @ViewBag.Title表示标题内容 也可以自己定义渲染的部分:比如在布局页中添加@ ...

  8. python,爬取小说网站小说内容,同时每一章存在不同的txt文件中

    思路,第一步小说介绍页获取章节地址,第二部访问具体章节,获取章节内容 具体如下:先获取下图章节地址 def stepa(value,headers): lit=[] response = reques ...

  9. 康谋分享 | 仿真驱动、数据自造:Anyverse巧用合成数据重构智能座舱

    随着汽车向智能化.场景化加速演进,智能座舱已成为人车交互的核心承载.从驾驶员注意力监测到儿童遗留检测,从乘员识别到安全带状态判断,座舱内的每一次行为都蕴含着巨大的安全与体验价值. 然而,这些感知系统要 ...

  10. Junit单元测试的Gradle设置

    官方文档 https://docs.gradle.org/current/userguide/java_testing.html test{ useJUnit() //指定使用junit执行测试. / ...