链接

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提高组省一冲奖班模测训练(三) 题解的更多相关文章

  1. [51Nod]NOIP2018提高组省一冲奖班模测训练(二)

    http://www.51nod.com/contest/problemList.html#!contestId=73&randomCode=4408520896354389006 还是原题大 ...

  2. [51Nod]NOIP2018提高组省一冲奖班模测训练(一)题解

    http://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 原题水题大赛.. A.珂朵莉的旅行 ...

  3. [51Nod]NOIP2018提高组省一冲奖班模测训练(四)翻车记+题解

    链接 下午5点的时候,突然想起来有这个比赛,看看还有一个小时,打算来AK一下,结果因为最近智商越来越低,翻车了,我还是太菜了.上来10分钟先切掉了C和A,结果卡在了B题,唉. A.砍树 一眼题,两遍树 ...

  4. NOIP2018提高组省一冲奖班模测训练(六)

    NOIP2018提高组省一冲奖班模测训练(六) https://www.51nod.com/Contest/ContestDescription.html#!#contestId=80 20分钟AC掉 ...

  5. NOIP2018提高组省一冲奖班模测训练(五)

    NOIP2018提高组省一冲奖班模测训练(五) http://www.51nod.com/Contest/ContestDescription.html#!#contestId=79 今天有点浪…… ...

  6. NOIP2018提高组省一冲奖班模测训练(四)

    NOIP2018提高组省一冲奖班模测训练(四) 这次比赛只AC了第一题,而且花了40多分钟,貌似是A掉第一题里面最晚的 而且还有一个半小时我就放弃了…… 下次即使想不出也要坚持到最后 第二题没思路 第 ...

  7. NOIP2018提高组省一冲奖班模测训练(三)

    NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...

  8. NOIP2018提高组省一冲奖班模测训练(二)

    比赛链接 NOIP2018提高组省一冲奖班模测训练(二) 今天发挥正常,昨天不在状态…… 花了很久A了第一题 第二题打了30分暴力 第三题投机取巧输出test1答案(连暴力都不知道怎么打,太弱了) 2 ...

  9. NOIP2018提高组省一冲奖班模测训练(一)

    比赛链接 https://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 这次考试的题非常有质量 ...

随机推荐

  1. 5.不用拷贝的对象可以用ref

    #include <iostream> #include <string> #include <boost/bind.hpp> #include <boost ...

  2. SecondaryNameNode合并元信息过程

  3. display的几种常用取值

    display的取值有很多种,下面列出比较常用的几种取值,还有其它的少用的值没有列出来: 1.none 此元素不会被显示,并且不占据页面空间,这也是与visibility:hidden不同的地方,设置 ...

  4. Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式

    Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式 Method Swizzing中一般替换方法都写在Category类别里吗?有没有别的实现方式 > ...

  5. sql索引碎片产生的原理 解决碎片的办法(sql碎片整理)

    本文讲述了SQL SERVER中碎片产生的原理,内部碎片和外部碎片的概念.以及解决碎片的办法和填充因子.在数据库中,往往每一个对于某一方面性能增加的功能也会伴随着另一方面性能的减弱.系统的学习数据库知 ...

  6. 解决高版本vm打开虚拟机报错

    问题: 打开虚拟机的文件目录,找到.vmx 文件 用记事本打开重命名后的“.vmx.txt”文件 找到行:policy.vm.mvmtid = "52 10 08 ed ff 34 ed d ...

  7. 为什么越来越少的开源项目使用 GPL 协议

    原文出处: opensource   译文出处:oschina/王练    前段时间,我在 RedMonk 上看到了一篇来自 Stephen O’Grady 的有趣推文,介绍了开源许可证目前的状态,以 ...

  8. Linux防火墙iptables介绍

    介绍网络防火墙是通过一个或多个允许或拒绝的规则来过滤网络流量的网络设备或软件.网络防火墙还可以执行更复杂的任务,例如网络地址转换,带宽调整,提供加密隧道以及更多与网络流量相关的任务.而我们的任务就是需 ...

  9. kubernetes学习与实践篇(一)主要概念介绍

    什么是kubernetes Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器. 主要功能 将多台 ...

  10. scrapy xpath选择器多级选择错误

    在学习scrapy中用xpath提取网页内容时,有时要先提取出一整个行标签内容,再从行标签里寻找目标内容.出现一个错误. 错误代码: def parse(self, response): sel = ...