链接

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. 4.bind绑定

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

  2. ip反查域名的详细信息(多种方法)

    不多说,直接上干货! 至于这里怎FQ,很简单,请见我下面的博客! kali 2.0安装 lantern(成功FQ) shadowsocks(简称SSFQ软件)步骤详解 FQ软件lantern-inst ...

  3. iOS 集成Protobuf,转换proto文件

    原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...

  4. bash编程,while嵌套case语句, file不能判断文件存在与否

    写一个脚本, 完成如下要求 (1)脚本可接受参数 : start, stop, restart, status, (2)如果参数非非法, 提示使用格式后报错退出; (3)如果是start, 则创建/t ...

  5. 关于element-ui框架里面table组件的使用

    1.表格的数据放哪里:后台返回的列表数据放到:data后面. 2.每一个列怎么显示数据:返回的列表里面的属性想要在列显示出来,将对应的字段名写到prop后面就行. 3.列表上面想显示序号:{{scop ...

  6. mongodb 的查询深入剖析

           db.表名.find({goods_id:3});                     //查询出 goods_id 为 3 的数据        db.表名.find({cat_i ...

  7. 紫书 例题 10-14 UVa 12034(组合数+递推)

    这道题有点类似动态规划,设答案为f(n) 第一个人有i个人,就有c(n,i)种可能 然后后面有f(n-i)种可能,所以相乘,然后枚举所有可能加起来就ok了. #include<cstdio> ...

  8. .NET 将 .config 文件嵌入到程序集

    原文:.NET 将 .config 文件嵌入到程序集 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Iron_Ye/article/details/ ...

  9. Android SDK Manager代理设置

    1.SDK Manager中打开 Tools—>Manage Add-on Sites…—>User Defined Sites 2.New …输入: http://android-mir ...

  10. List和iterator的区别

    (1)在用Query方法查询的时候,通过HQL语句来得到Query对象,并对Query对象进行操作,首先是用list方法获取到Query的List集合并输出 public void listQuery ...