P2340 [USACO03FALL]Cow Exhibition G题解
新的奇巧淫技
众所周知,模拟退火是一种很强大的算法,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题解的更多相关文章
- USACO07NOV Cow Relays G 题解
		题目 For their physical fitness program, \(N (2 ≤ N ≤ 1,000,000)\) cows have decided to run a relay ra ... 
- 2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)
		2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed) [P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生 ... 
- POJ2184 Cow Exhibition[DP 状态负值]
		Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12420 Accepted: 4964 D ... 
- [POJ 2184]--Cow Exhibition(0-1背包变形)
		题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total S ... 
- Cow Exhibition   变种背包
		Cow Exhibition Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ... 
- POJ-2184 Cow Exhibition(01背包变形)
		Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10949 Accepted: 4344 Descr ... 
- POJ 2184 Cow Exhibition【01背包+负数(经典)】
		POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ... 
- POJ 2184 Cow Exhibition (01背包变形)(或者搜索)
		Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10342 Accepted: 4048 D ... 
- poj 2184 Cow Exhibition(01背包)
		Cow Exhibition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10882 Accepted: 4309 D ... 
随机推荐
- Java实现获取命令行中的指定数据
			构造一个ping的命令类这个类中可以设置需要ping的目标域名类提供方法public void exec();方法执行完毕后可以读取ping的次数,ping的成功回应包个数ping的丢包个数,ping ... 
- element封装表格
			<template> <div> <el-scrollbar class="table-wrap"> <el-table v-loadin ... 
- Charles 抓包(Charles二)
			前面安装了Charles,并初步配置了一下:https://blog.csdn.net/qq_38175040/article/details/105411407 今天开始正式抓包了 但过程却不是很顺 ... 
- oracle之二实例管理及数据库的启动/关闭
			实例管理及数据库的启动/关闭 2.1 实例和参数文件 1.instance 功能:用于管理和访问database.instance在启动阶段读取初始化参数文件(init parameter fil ... 
- 按正常步骤对github的仓库进行push自己本地的代码提示push rejected
			按正常步骤对github的仓库进行push自己本地的代码提示push rejected. 大概原因是:初始化项目时,远程仓库我建了README.md文件,而本地仓库与远程仓库尚未进行文件关联,因此需要 ... 
- 第17课 - make 中的路径搜索(上)
			第17课 - make 中的路径搜索(上) 1. 问题 在以往的 make 学习中,我们使用到的 .c 文件和 .h 文件都与 makefile 处在同一个路径.在实际的工程项目中,所有的源文件和头文 ... 
- 云计算openstack核心组件——neutron网络服务(8)
			一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ... 
- yum管理——ningx部署私有repo源(4)
			一.前言: 为了加快安装效率,或者日后服务器处于内网环境,本次特写一片搭建的是一个属于个人私有repo源仓库,思路如下: 1.首先到mirrors.ustc.edu.cn下载用到的源的仓库 2.然后安 ... 
- matlab数字图像处理-冈萨雷斯-数据类和图像类之间的转换
			亮度图像 二值图像 属于注释 数据类间的转换 图像类和类型间的转化 把一个double类的任意数组转换成[0,1]的归一化double类数组----->mat2gray 图像类和类型间的转化例题 ... 
- Gradle系列之Android Gradle高级配置
			本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ... 
