新的奇巧淫技

原题传送门

众所周知,模拟退火是一种很强大的算法,DP很强,但我模拟退火也不虚,很多题你如果不会的话基本可以拿来水很多分。比如这道题,我用模拟退火可以轻松水过(虽然我是足足交了两页才过)但是没有什么大问题,如果模拟退火还不会,建议先看你谷日报学习一下。剩下的主要就是一些细节,看代码。

#include <bits/stdc++.h>
using namespace std;
#define gc getchar()
#define re register
double st=clock();
int n,tot,ans,x,y;
int I[1000000+10],E[1000000+10];
struct node{
int IQ,EQ;
}a[1000000+10];//定义结构体,方便random_shuffle inline int read(){
int r=0,l=1;char ch=gc;
while(!isdigit(ch)){if(ch=='-')l=-1;ch=gc;}
while(isdigit(ch)){r=(r<<3)+(r<<1)+ch-'0';ch=gc;}
return r*l;
} inline void add(int x,int y){
if(x<0&&y<0)return;//如果两个都是0,都答案没有任何贡献,直接pass
if(x>=0&&y>=0)
return a[++tot]=(node){x,y},void();//如果两个都>0,那么最优解一定会有它,直接加进去即可
if((x<0&&y>0&&abs(x)-y>=rand())||(x>0&&y<0&&abs(y)-x>=rand()))return;//如果两个值是一正一负相差太大可以pass,但一定要注意是>rand(),这样会有一定概率接受这个解,至于为什么,留给读者思考
if(x+y<0)if(exp(-(x+y))>(double)rand()/(double)RAND_MAX)return;//如果两个值相加为0,对答案会有负贡献,但仍要有一定几率接受,好像和上面判重了,因为本人太菜,不知道去掉对不对,所以就写上了~
a[++tot]=(node){x,y};
} inline void solve(){
tot=0;for(re int i=1;i<=n;++i)add(I[i],E[i]);//初始化,重新选取合适牛
random_shuffle(a+1,a+tot+1);//打乱重排
x=0,y=0;
for(re int i=1;i<=tot;++i){
x+=a[i].IQ;y+=a[i].EQ;
if(x<=0&&y<=0)//到此为止,答案已经不合法
if(exp(ans-x-y)>(double)rand()/(double)RAND_MAX)return;//运用模拟退火思想,虽然已经不合法,但考虑后面可能有解加上后就合法,所以有一定概率接受这个解并继续。这也是模拟退火算法的优势
if(x>0&&y>0)ans=max(ans,x+y);//合法的话,更新答案
}
} int main(){
srand(time(NULL));
n=read();
for(re int i=1;i<=n;++i)I[i]=read(),E[i]=read();//存取各头牛的IQ和EQ,因为上方add时会有删除,因为是随机删除,可能会造成第一次就把最优解中的一头牛删除,然后就挂了,上面我的64分就是这样错的
int crl=15000;
while(crl--)solve();
printf("%d\n",ans);
return 0;
}

random_shuffle大法好

P2340 [USACO03FALL]Cow Exhibition G题解的更多相关文章

  1. USACO07NOV Cow Relays G 题解

    题目 For their physical fitness program, \(N (2 ≤ N ≤ 1,000,000)\) cows have decided to run a relay ra ...

  2. 2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)

    2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed) [P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生 ...

  3. POJ2184 Cow Exhibition[DP 状态负值]

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12420   Accepted: 4964 D ...

  4. [POJ 2184]--Cow Exhibition(0-1背包变形)

    题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  5. Cow Exhibition 变种背包

    Cow Exhibition Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  6. POJ-2184 Cow Exhibition(01背包变形)

    Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10949 Accepted: 4344 Descr ...

  7. POJ 2184 Cow Exhibition【01背包+负数(经典)】

    POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...

  8. POJ 2184 Cow Exhibition (01背包变形)(或者搜索)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10342   Accepted: 4048 D ...

  9. poj 2184 Cow Exhibition(01背包)

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10882   Accepted: 4309 D ...

随机推荐

  1. nodejs解压版安装和配置(带有搭建前端项目脚手架)

    nodejs 安装  我先前用了nvm,觉得nvm挺厉害可以随时更换nodejs版本,但是研究了下,可能自己功力不够还是什么,并不好用,中间还出现了错误:所以最后还是卸载了: 本文图文并茂的一步一步的 ...

  2. 2020重新出发,JAVA高级,JVM

    JVM的基本概念 JVM是可运行java代码的假想计算机,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆和一个存储方法域.JVM是运行在操作系统之上的,它与硬件没有直接的交互. [外链图片 ...

  3. 摆书 book

    题目描述: dxy家收藏了一套书,这套书叫<SDOI故事集>,<SDOI故事集>有n(n≤19)本,每本书有一个编号,从1号到n号. dxy把这些书按编号从小到大,从上往下摞成 ...

  4. 软件测试----xml文件介绍

    软件测试 目录 软件测试 一.什么是XML?: 二.XML和HTML的差异: 三.XML的特点 1.XML可以自定义标签 2.XML必须包含根元素 如上所示, 3.XML标签对大小写敏感 4.XML ...

  5. 使用VSCode和CMake构建跨平台的C/C++开发环境

    日前在学习制作LearnOpenGL教程的实战项目Breakout游戏时,希望能将这个小游戏开发成跨平台的,支持在多个平台运行.工欲善其事必先利其器,首先需要做的自然是搭建一个舒服的跨平台C/C++开 ...

  6. day54:django:锁和事务&Ajax&中间件Middleware

    目录 1.ORM中的锁和事务 2.Ajax 3.中间件:Middleware 3.1 什么是中间件? 3.2 django请求的生命周期 3.3 中间件可以定义的5个方法 3.4 自定义中间件的流程 ...

  7. Flutter学习五之网络请求和轮播图的实现

    上期讲到了,怎样实现一个下拉刷新和加载更多的列表,数据更新,需要使用到网络请求,在flutter中,怎样实现一个网络请求呢?官方使用的是dart io中的HttpClient发起的请求,但HttpCl ...

  8. 转载:pycharm IDE 导入自定义模块

    http://www.mamicode.com/info-detail-2241193.html

  9. Git-使用Rebase合并分支

    commit 合并 在开发过程中,可能会出现多个 commit 所涉及的逻辑都是同一个功能模块,此时,会导致 log tree 非常的混乱,不美观,因此,我们可以将多个 commit 进行合并,变成一 ...

  10. Python-嵌套列表变成普通列表

    如何把[1, 5, 6, [2, 7, [3, [4, 5, 6]]]]变成[1, 5, 6, 2, 7, 3, 4, 5, 6]? 思考: -- for循环每次都遍历列表一层 -- 把取出的单个值加 ...