Problem:给出全班人的个数总分和小明的分数(满分100分),求小明最低排名和最高排名

sol:假设小明的排名为k,总分为sum,小明的分数是r,

贪心求解,

最坏情况下,小明前面的比小明高一分(r+1)分,那么给后面的人的分数是sum-(k-1)*(r+1)-r

最优情况下,小明前面的人都是满分(100)分,那么给后面人的分数是sum-(k-1)*100-r

所以对于后面人分数的取值范围是A=[sum-(k-1)*100-r,sum-(k-1)*(r+1)-r]

而对于一个很显然的结论由于小明是第k名所以在他后面(含一样的分数)有n-k人,他们的分数的取值范围是B=[0,(n-k)*r]

如果说A和B有交集的话该问题有解,可以求出连续的一段范围求最小的l,最大的r

判断交集快速的方法是

1. 判包含关系。

2.判某条线段的左右断点是不是在另外一条线段内。

# include<bits/stdc++.h>
using namespace std;
bool check(int l1,int r1,int l2,int r2)
{
if (l1>r1) swap(l1,r1);
if (l2>r2) swap(l2,r2);
if (l1>=l2&&r2>=r1) return ;
if (l2>=l1&&r1>=r2) return ;
if (l2>=l1&&l2<=r1) return ;
if (r2>=l1&&r2<=r1) return ;
return ;
}
int main()
{
int N,A,S;
scanf("%d%d%d",&N,&A,&S);
if (A==) { puts("1 1");return ; }
int l=N,r=;
for (int i=;i<=N;i++)
if (check(S-(i-)*(A+)-A,S-(i-)*-A,,A*(N-i))) {
l=min(l,i); r=max(r,i);
}
printf("%d %d\n",l,r);
return ;
}

sol:考虑问题平方和就是要大的数尽可能大,通过题目中所说的东西

  • rec1=a or b
  • rec2=a and b
  • a=rec1 ,b=rec2

发现本质其实是把两个数的某个二进制位交换,所以最后就是每位有若干的1,让你分配到对应的位置,最大化平方和

就是尽可能放大的数,然后平方以后就是最大的。

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int MAXN=;
int b[MAXN],n;
inline int read()
{
int X=,w=; char c=;
while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
while (c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
void getbit(int x)
{
for (int i=;i<=;i++)
if ((x>>i)&==) b[i]++;
}
signed main()
{
n=read(); int x;
for (int i=;i<=n;i++) x=read(),getbit(x);
int num=;for (int i=;i<=;i++) num+=b[i];
int ans=;
while () {
if (num==) break;
int tmp=;
for (int i=;i>=;i--)
if (b[i]>) b[i]--,tmp+=(<<i),num--;
ans+=tmp*tmp;
}
cout<<ans<<endl;
return ;
}

sol:一道DP题其实比较简单

一开始状态定义错了,导致最长不下降子序列弄错了(其实和前面0的个数有关系)

f[i][j][k]前i个,有j个0,LIS长度为k个的数的可能性

若第i+1位为0,那么f[i+1][j+1][k]+=f[i][j][k]

若第i+1位为1,那么f[i+1][j][max(k,j)]+=f[i][j][k]

为什么是max(k,j)呢? 由于第i+1位为是1那么和前面有j个0构成一个最长上升子序列长度是j,

而此时加入一个1才到达长度为k,那么此时最长的长度可能并不会发生更新,可能还是前面都是0的子序列更优(一开始没有把0的个数作为一个状态!)

初始值f[0][0][0]=1

# include <bits/stdc++.h>
# define int long long
using namespace std;
const int MAXN=;
const int mo=1e9+;
int n;
int f[MAXN][MAXN][MAXN];
inline int read()
{
int X=,w=; char c=;
while (!(c>=''&&c<='')) w|=c=='-',c=getchar();
while (c>=''&&c<='') X=(X<<)+(X<<)+(c^),c=getchar();
return w?-X:X;
}
signed main()
{
n=read(); memset(f,,sizeof(f));
f[][][]=;
//f[i][j][k]前i个,有j个0,长度为k个数
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
for (int k=;k<=n;k++)
{
f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k])%mo;
f[i+][j][max(k,j)+]=(f[i+][j][max(k,j)+]+f[i][j][k])%mo;
}
int ans=;
for (int j=;j<=n;j++)
for (int k=;k<=n;k++)
ans=(ans+(max(k,j)*f[n][j][k])%mo)%mo;
cout<<ans<<endl;
return ;
}

HGOI 20181030晚 题解的更多相关文章

  1. codeforces 476C.Dreamoon and Sums 解题报告

    题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...

  2. 牛客编程巅峰赛S1第5场 - 青铜&白银 C.排队 (优先队列,归并排序)

    题意:有\(m\)个窗口,\(n\)个人排队,每个人都有各自的办理时间,只有办理完成窗口才能空出来,后面的人开始办理,求有多少人比后面的人开始办理的早但完成的晚. 题解:我们可以用优先队列来模拟办理, ...

  3. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  4. HGOI 20181028 题解

    HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...

  5. 6.25考试整理:江城唱晚&&不老梦&&棠梨煎雪——题解

    按照旧例,先安利一下主要作者:一扶苏一 以及扶苏一直挂念的——银临姐姐:银临_百度百科 (滑稽) 好哒,现在步入正题: 先看第一题: 题解: 在NOIP范围内,看到“求方案数”,就说明这个题是一个计数 ...

  6. HGOI 20190310 题解

    /* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...

  7. HGOI 20190303 题解

    /* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...

  8. HGOI 20180224 题解

    /* The Most Important Things: ljc chat with fyh on QQTa说期末考Ta数学74分感觉不好但是我觉得fyh是地表最强的鸭~~(of course en ...

  9. HGOI 20190218 题解

    /* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...

随机推荐

  1. ubuntu 下 go 语言调试器 dlv 的安装

    1.  从 https://github.com/derekparker/delve.git 下载delve压缩包delve-master.zip. 2. 使用 winscp 工具将delve-mas ...

  2. PySide图形界面开发(一)

    一.为什么要使用PySide? PySide由Qt的官方团队--Nokia Qt进行维护,集成了Qt和Python的优势.一个PySide程序员只需要使用简单的Python语言就能够发挥Qt的所有功能 ...

  3. 基于TLS证书手动部署kubernetes集群(下)

    一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已经部署好了etcd集群.flannel网络以及每个节点的docker,接下来部署master节 ...

  4. 20155222卢梓杰 实验九 Web安全基础

    实验九 Web安全基础 今天不多bb,打开webgoat就是干好吧 1.简单字符串sql注入 可以看到这个实验说明是 "下表允许用户查看其信用卡号码.尝试插入一个SQL字符串,以显示所有信用 ...

  5. 2017-2018-2 20155315《网络对抗技术》Exp6 :信息搜集与漏洞扫描

    实验目的 进行信息搜集的工作,为实战做准备 教程 实验内容 外围信息搜集 NMAP OpenVAS 实验步骤 (一)各种搜索技巧的应用 实战的前提是进行信息搜索.当我们想要有针对地进行操作的时候,就要 ...

  6. 20155321 《网络攻防》 Exp4 恶意代码分析

    20155321 <网络攻防> Exp4 恶意代码分析 计划任务监控 在C盘根目录下建立一个netstatlog.bat文件(先把后缀设为txt,保存好内容后记得把后缀改为bat),内容如 ...

  7. GATT scan的流程

    BLE scan 在bluedroid的实现中,有两个接口:一个是discovery,一个是ble observe,这两者有什么区别呢? 这里追了一下代码发现,inquiry 是上层调用search ...

  8. SQL Server 常用内置函数

    本文用于收集在运维中经常使用的系统内置(built-in)函数,持续整理中 一,常用Metadata函数 1,查看数据库的ID和Name db_id(‘DB Name’),db_name('DB ID ...

  9. C语言与数据库操作入门(Win版)

    C语言与数据库操作入门(Win版) 2017年12月10日 17:30:17 阅读数:1387 数据库,DataBase,学C语言的是不是想说,很想爱她却并不容易呢?不用着急,C语言也可以操作数据库的 ...

  10. 基于.NET Standard的分布式自增ID算法--Snowflake代码实现

    概述 上篇文章介绍了3种常见的Id生成算法,本篇主要介绍如何使用C#实现Snowflake. 基础字段 /// <summary> /// 工作节点Id(长度为5位) /// </s ...