启智树提高组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. DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

    大家好,我是狂师. 前阵子在知乎闲逛时,有个问题激起了大家的热议:"DeepSeek 如何颠覆传统软件测试?测试工程师会被淘汰吗".这看似简单的一问,激起层层思考,针对这个问题,今 ...

  2. Laravel admin 用户头像显示不出的原因及解决方法

    已经使用命令 php artisan storage:link 创建过软链接了,头像仍然不显示. 发现链接显示的是 http://localhost/storage/images/b6f0ad07b9 ...

  3. 基础命令:dd、tar、ln、find、逻辑符号、alisa别名、md5sun校验、lrzsz文件上传下载、wget

    目录 3.0 dd读取.转换并输出数据 3.1 压缩 (tar.zip).解压缩(tar xf.unzip) 3.2 ln软硬链接 3.2.1 软链接: 3.2.2 硬链接: 3.3 find文件查找 ...

  4. React Props指南:从基础到高阶应用的最佳实践解析

    在 React 中,Props(属性)是组件间通信和数据传递的核心机制.通过合理使用 Props,开发者可以构建动态.可复用且易于维护的组件体系.本文将深入探讨 Props 的核心概念.使用方法及最佳 ...

  5. MYSQL架构介绍

    专栏持续更新中- 本专栏针对的是掌握MySQL基本操作后想要对其有深入了解并且有高性能追求的读者. 第一篇文章主要是对MySQL架构的主要概括,让读者脑海中有个对MySQL大体轮廓,很多地方没有展开细 ...

  6. Zotero 附件云同步(非 WebDAV 方法)

    1.说明 适用范围更广,但是操作步骤较复杂. 使用 zotero 仅同步题录信息,使用其他云同步程序同步文献的附件,此处以坚果云为例进行演示. 准备: zotero 和 坚果云 注册账号 zotero ...

  7. 【QT】使用Qxlsx读取Excel单元格中函数表达式的结果值

    [QT]使用Qxlsx读取Excel单元格中函数表达式的结果值 零.起因 是这样的,目前朋友托我写一款模板生成软件,任务是先把他写的程序文件复制一份出来,然后再根据Excel中对应位置的单元格的值,修 ...

  8. 【虚拟机】Windows(x86)上部署ARM虚拟机(Ubuntu)

    [虚拟机]Windows(x86)上部署ARM虚拟机(Ubuntu) 零.起因 最近在学嵌入式,这就不得不涉及ARM指令集,但是电脑是x86指令集的,用手机不太方便,买开发板又要等几天--,总之就是要 ...

  9. 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析

    引言 ❝ 小编是一名10年+的.NET Coder,期间也写过Java.Python,从中深刻的认识到了软件开发与语言的无关性.现在小编已经脱离了一线开发岗位,在带领团队的过程中,发现了很多的问题,究 ...

  10. 搭建Zookeeper、Kafka集群

    搭建Zookeeper.Kafka集群 Zookeeper.Kafka集群系统环境配置 配置IP ssh root@192.168.1.190 "rm -rf /etc/machine-id ...