HGOI 20181030晚 题解

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晚 题解的更多相关文章
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- 牛客编程巅峰赛S1第5场 - 青铜&白银 C.排队 (优先队列,归并排序)
题意:有\(m\)个窗口,\(n\)个人排队,每个人都有各自的办理时间,只有办理完成窗口才能空出来,后面的人开始办理,求有多少人比后面的人开始办理的早但完成的晚. 题解:我们可以用优先队列来模拟办理, ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- HGOI 20181028 题解
HGOI 20181028(复赛备考) /* 真是暴力的一天,最后一题MLE?由于数组开得太大了!!! 270滚粗 考场上好像智商高了很多?!(假的) */ sol:暴力求解,然后没有数据范围吐槽一下 ...
- 6.25考试整理:江城唱晚&&不老梦&&棠梨煎雪——题解
按照旧例,先安利一下主要作者:一扶苏一 以及扶苏一直挂念的——银临姐姐:银临_百度百科 (滑稽) 好哒,现在步入正题: 先看第一题: 题解: 在NOIP范围内,看到“求方案数”,就说明这个题是一个计数 ...
- HGOI 20190310 题解
/* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...
- HGOI 20190303 题解
/* 记一串数字真难. 5435 今天比赛又是hjcAK的一天. 今天开题顺序是312,在搞T1之前搞了T3 昨天某谷月赛真是毒瘤. 但是讲评的同学不错,起码T4看懂了... 构造最优状态然后DP的思 ...
- HGOI 20180224 题解
/* The Most Important Things: ljc chat with fyh on QQTa说期末考Ta数学74分感觉不好但是我觉得fyh是地表最强的鸭~~(of course en ...
- HGOI 20190218 题解
/* 又是AK局... hjc又双叒叕AK了... Hmmm...我侥幸 */ Problem A card 给出无序序列a[]可以选择一个数插入到合适的位置作为一次操作,至少多少次操作后可以把序列变 ...
随机推荐
- Spark内部流程图
转载自:https://blog.csdn.net/refuil/article/details/52055104
- 常用数据库驱动名称以及URL
oracle: 驱动类的名字:oracle.jdbc.driver.OracleDriver URL:jdbc:oracle:thin:@dbip:port:databasename Mysql: 驱 ...
- Python基础(list和tuple)可变集合和‘不可变’集合
list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...
- 【ORACLE】Win2008R2修改oracle数据库实例名
需求说明:要求将windows平台的数据库实例名由orcl改为haha 参考: https://www.cnblogs.com/junnor/archive/2013/03/05/2945245.ht ...
- git 创建标签和删除标签
创建标签 在Git中打标签非常简单,首先,切换到需要打标签的分支上: $ git branch * dev master $ git checkout master Switched to branc ...
- 转 ssh-keygen 的 详解
为了让两个linux机器之间使用ssh不需要用户名和密码.所以采用了数字签名RSA或者DSA来完成这个操作. 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.6 ...
- torchvision 批量可视化图片
1.1 简介 计算机视觉中,我们需要观察我们的神经网络输出是否合理.因此就需要进行可视化的操作. orchvision是独立于pytorch的关于图像操作的一些方便工具库. torchvision的详 ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- Docker swarm集群搭建教程
一.什么是Swarm Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行为.比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavio ...
- 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 ...