[51Nod]NOIP2018提高组省一冲奖班模测训练(三) 题解
A.Anan的派对
题意:Anan想举办一个派对。Anan的朋友总共有 n 人。第i个人如果参加派对会得到 \(c_i\) 的快乐值,除他自己外每多一个人参加他会减少 \(d_i\) 的快乐值。Anan想让这个派对的总快乐值尽可能大,在这个基础上,能来的人越多越好。Anan想知道最佳的邀请方案的快乐值与参加人数。对于 \(50\%\) 的数据 , $n\le 1000 $
假设来的人的集合为 \(S\),则快乐值为 \(\sum_{i\in S}c_i-(|S|-1)\times d_i\)
枚举集合大小,然后排序选前 \(|S|\) 个即可
#include<stdio.h>
#include<algorithm>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
struct node{
int c,d;
}a[1002];
int n,cnt;
long long ans=-1e18,r;
int main(){
scanf("%d",&n);
REP(i,1,n)scanf("%d",&a[i].c);
REP(i,1,n)scanf("%d",&a[i].d);
REP(t,1,n){
std::sort(a+1,a+1+n,[&](const node&a,const node&b){return a.c-1ll*a.d*(t-1)>b.c-1ll*b.d*(t-1);});
r=0;
REP(i,1,t)r+=a[i].c-1ll*a[i].d*(t-1);
if(r>=ans)ans=r,cnt=t;
}
printf("%lld\n%d\n",ans,cnt);
return 0;
}
B.XYG的蛋糕
题意:一个 \(n\times m\) 的矩形,需要把它分成 \(1\times 1\) 的小块,每次选出已经分出的某一个矩形,切一刀,可以横切或竖切。求方案数,两个切法不同当且仅当其中一个切法中存在一条刀痕,在另一个切法中不存在。 \(n,m\le 300\)
考虑DP,设 \(dp[i][j]\) 表示大小为 \(i\times j\) 的矩形的方案数,第一反应是
\(dp[i][j]=\sum_x dp[x][j]\times dp[i-x][j]+\sum_ydp[i][y]\times dp[i][j-y]\)
但是这样有重复
增加一维 \(k\) 表示允不允许横切或竖切即可
#include<stdio.h>
#include<cstring>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
const int p=998244353;
int f[305][305][3];
inline int dfs(int x,int y,int z){
if(x==1&&y==1)return 1;
int&ans=f[x][y][z];
if(~ans)return ans;
ans=0;
if(z!=1)REP(i,1,x-1)ans=(ans+1ll*dfs(i,y,1)*dfs(x-i,y,0))%p;
if(z!=2)REP(i,1,y-1)ans=(ans+1ll*dfs(x,i,2)*dfs(x,y-i,0))%p;
return ans;
}
int main(){
memset(f,-1,sizeof f);
int n,m;scanf("%d%d",&n,&m);
printf("%d\n",dfs(n,m,0));
return 0;
}
C.WZD的洞洞
题意:平面上有n个物品,每个物品有坐标xi,yi和价值wi,WZD希望用洞洞包含住价值尽可能高的物品。由于洞洞的构造,其两条边必须平行于坐标轴,且直角在左下方(也就是说,洞洞只能平行移动),并且要求直角必须恰好落在一个物品上。求洞洞能包含住最大价值为多少的物品。n≤100000,0<xi,yi≤10000,-10000<wi<10000。
这个直角三角形只能平行移动,这意味着它的斜边的斜率是不变的,而且题目要求直角顶点一定在一个物品上,所以如果用斜率为斜边的斜率的直线扫,顶点在一个物品上的三角形能包含另外一个物品的条件是他们在这个直线间的距离小于三角形的高,因此two pointers搞一下,树状数组维护一下即可
#include<stdio.h>
#include<cmath>
#include<algorithm>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
const int N=1e5+5,S=10005;
struct BIT{
int c[S],n;
inline void add(int p,int x){for(;p<=n;p+=p&-p)c[p]+=x;}
inline int ask(int p){int r=0;for(;p;p-=p&-p)r+=c[p];return r;}
}tx,ty;
int n,A,B;
struct node{int x,y,w;double d;}a[N];
inline void smax(int&x,const int&y){x<y?x=y:0;}
int main(){
scanf("%d%d%d",&n,&A,&B);
const double base=sqrt(A*A+B*B),maxd=A*B/base;
REP(i,1,n){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
a[i].d=(double)(B*a[i].x+A*a[i].y)/base;
smax(tx.n,a[i].x),smax(ty.n,a[i].y);
}
std::sort(a+1,a+1+n,[&](const node&a,const node&b){return a.d>b.d;});
int l=1,sum=0,ans=0;
REP(r,1,n){
sum+=a[r].w;
while(l<r&&a[l].d-a[r].d>maxd){
tx.add(a[l].x,-a[l].w),ty.add(a[l].y,-a[l].w);
sum-=a[l++].w;
}
tx.add(a[r].x,a[r].w),ty.add(a[r].y,a[r].w);
smax(ans,sum-tx.ask(a[r].x-1)-ty.ask(a[r].y-1));
}
printf("%d\n",ans);
return 0;
}
[51Nod]NOIP2018提高组省一冲奖班模测训练(三) 题解的更多相关文章
- [51Nod]NOIP2018提高组省一冲奖班模测训练(二)
http://www.51nod.com/contest/problemList.html#!contestId=73&randomCode=4408520896354389006 还是原题大 ...
- [51Nod]NOIP2018提高组省一冲奖班模测训练(一)题解
http://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 原题水题大赛.. A.珂朵莉的旅行 ...
- [51Nod]NOIP2018提高组省一冲奖班模测训练(四)翻车记+题解
链接 下午5点的时候,突然想起来有这个比赛,看看还有一个小时,打算来AK一下,结果因为最近智商越来越低,翻车了,我还是太菜了.上来10分钟先切掉了C和A,结果卡在了B题,唉. A.砍树 一眼题,两遍树 ...
- NOIP2018提高组省一冲奖班模测训练(六)
NOIP2018提高组省一冲奖班模测训练(六) https://www.51nod.com/Contest/ContestDescription.html#!#contestId=80 20分钟AC掉 ...
- NOIP2018提高组省一冲奖班模测训练(五)
NOIP2018提高组省一冲奖班模测训练(五) http://www.51nod.com/Contest/ContestDescription.html#!#contestId=79 今天有点浪…… ...
- NOIP2018提高组省一冲奖班模测训练(四)
NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...
- NOIP2018提高组省一冲奖班模测训练(三)
NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...
- NOIP2018提高组省一冲奖班模测训练(二)
比赛链接 NOIP2018提高组省一冲奖班模测训练(二) 今天发挥正常,昨天不在状态…… 花了很久A了第一题 第二题打了30分暴力 第三题投机取巧输出test1答案(连暴力都不知道怎么打,太弱了) 2 ...
- NOIP2018提高组省一冲奖班模测训练(一)
比赛链接 https://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 这次考试的题非常有质量 ...
随机推荐
- SQL Server在用户自定义函数(UDF)中使用临时表
SQL Server在用户自定义函数中UDF使用临时表,这是不允许的. 有时是为了某些特殊的场景, 我们可以这样的实现: CREATE TABLE #temp (id INT) GO INSERT I ...
- MySql系列之单表查询
单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 关键字的执行 ...
- 中断函数中不能使用printf的原因
vxworks 中断处理程序之所以不用printf,本质在于printf是将信息输出到标准输出设备(STDOUT)中, 整个标准输出设备是一个全局变量,由于有semTake操作,那么就会发生阻塞,vx ...
- 洛谷—— P2419 [USACO08JAN]牛大赛Cow Contest
https://www.luogu.org/problem/show?pid=2419 题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, convenie ...
- 二、 HBase核心功能模块。
Hadoop 框架包含两个核心组件: HDFS 和 MapReduce 其中 HDFS 是文件存储系统,负责数据存储: MapReduce 是 ...
- ArcGIS api for javascript——以地理处理结果为条件查询地图
这里发生什么任务呢?当第一次单击地图,单击的坐标被发送到一个Geoprocessor任务.该任务访问服务器上的通过ArcGIS Server 地理处理服务提供的可用的GIS模型.本例中模型计算驱动时间 ...
- 进程:linux用户态-内核态
用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permi ...
- java 自己定义异常,记录日志简单说明!留着以后真接复制
log4j 相关配制说明:http://blog.csdn.net/liangrui1988/article/details/17435139 自己定义异常 package org.rui.Excep ...
- Android Volley 具体解释 Google公布的一套用于网络通信的工具库
下载地址:git clone https://android.googlesource.com/platform/frameworks/volley 或 : https://github.com/mc ...
- oracle之ROWNUM的查询应用
1 在ORACLE数据库中,ROWNUM是ORACLE数据库为查询结果加入的一个伪列.起始值为1.经常使用来处理查询结果的分页. 2 因为ROWNUM的特殊性,使用时候一般是分三层: 第一层:先进行查 ...