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. Spark内部流程图

    转载自:https://blog.csdn.net/refuil/article/details/52055104

  2. 常用数据库驱动名称以及URL

    oracle: 驱动类的名字:oracle.jdbc.driver.OracleDriver URL:jdbc:oracle:thin:@dbip:port:databasename Mysql: 驱 ...

  3. Python基础(list和tuple)可变集合和‘不可变’集合

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  4. 【ORACLE】Win2008R2修改oracle数据库实例名

    需求说明:要求将windows平台的数据库实例名由orcl改为haha 参考: https://www.cnblogs.com/junnor/archive/2013/03/05/2945245.ht ...

  5. git 创建标签和删除标签

    创建标签 在Git中打标签非常简单,首先,切换到需要打标签的分支上: $ git branch * dev master $ git checkout master Switched to branc ...

  6. 转 ssh-keygen 的 详解

    为了让两个linux机器之间使用ssh不需要用户名和密码.所以采用了数字签名RSA或者DSA来完成这个操作. 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.6 ...

  7. torchvision 批量可视化图片

    1.1 简介 计算机视觉中,我们需要观察我们的神经网络输出是否合理.因此就需要进行可视化的操作. orchvision是独立于pytorch的关于图像操作的一些方便工具库. torchvision的详 ...

  8. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  9. Docker swarm集群搭建教程

    一.什么是Swarm Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行为.比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavio ...

  10. LeetCode 637. Average of Levels in Binary Tree二叉树的层平均值 (C++)

    题目: Given a non-empty binary tree, return the average value of the nodes on each level in the form o ...