博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF1054C]Candies Distribution
阅读量:4947 次
发布时间:2019-06-11

本文共 1247 字,大约阅读时间需要 4 分钟。

题目:Candies Distribution 

传送门:

分析:

方法一:

1)类似拓扑排序的做法。

2)当$L_i,R_i$均为$0$时,这个数就是当前最大的数,可以移除并且去掉他带来的影响,即左边的$R_i$减一,右边得$L_i$减一。

3)当$L_i,R_i$均为$0$时,就当这个点入度为$0$,移除影响就相当于去掉与其相邻的边。

#include 
using namespace std;const int maxN=1005;vector
tp;int n,L[maxN],R[maxN],val[maxN];int main() { scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d",L+i); for(int i=1;i<=n;++i)scanf("%d",R+i); int tn=n; for(;;){ tp.clear(); for(int i=1;i<=n;++i) if(!L[i] && !R[i]){tp.push_back(i);val[i]=tn;L[i]=R[i]=-1;} if(tp.size()==0)break; tn-=tp.size(); for(auto it:tp){ for(int i=1;i

方法二:

学到了一种神奇的构造。

4)如果这个序列是存在,第$i$个小朋友分糖数为$ n-(L_i-R_i) $必然是不会冲突的,检查这个序列,判断是否满足题意。

5)这道题事实上在询问有多少小朋友糖比自己多,无论最终分糖方案是什么,得到相同糖的小朋友的分组是一样的。

#include
using namespace std;const int N = 1005;int L[N],R[N],res[N];int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d",L+i); for(int i=1;i<=n;++i)scanf("%d",R+i); for(int i=1;i<=n;++i)res[i]=n-L[i]-R[i]; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j){ R[i]-=res[j]>res[i]; L[j]-=res[j]

 

如果保证有合法解,求一种可行解,然后范围又极大,可以用第二种方法直接构造呀

 

转载于:https://www.cnblogs.com/hjj1871984569/p/10398526.html

你可能感兴趣的文章
手动通知扫描SD卡主动生成缩略图
查看>>
js中tagName和nodeName
查看>>
PC-XP系统忘记密码怎么办
查看>>
Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)
查看>>
深入了解Oracle ASM(二):ASM File number 1 文件目录
查看>>
SQL数据库学习系列之一
查看>>
Boosting(提升方法)之AdaBoost
查看>>
CUDA学习1 在Visual Studio和CodeBlocks上配置
查看>>
JavaScript(6)——事件1.0
查看>>
2013 ACM-ICPC China Nanjing Invitational Programming Contest 总结
查看>>
【Hibernate学习笔记-5】@Formula注解的使用
查看>>
链接元素<a>
查看>>
Binding object to winForm controller through VS2010 Designer(通过VS2010设计器将对象绑定到winForm控件上)...
查看>>
Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
查看>>
前端性能优化集【持续更新】
查看>>
第二章:webdriver 控制浏览器窗口大小
查看>>
四则运算2初步构思
查看>>
Break the Chocolate(规律)
查看>>
C#jbox小节
查看>>
结构体指针释放的问题
查看>>