当前位置: 首页 > news >正文

POJ-3270 Cow Sorting(贪心+置换)

题意:

FJ有N头牛,N头牛都有一个不同的脾气值,初始N头牛按脾气值是无序的,现要求将牛按脾气从小到大排序花费的最小力气。每次操作只能交换两头牛且付出的力气是两头牛的脾气之和。

思路:

首先较为容易地分析出要想最小化答案,我们进行交换的两个位置应该得局限在同一个轮换中。然后正常思路是贪心地通过每个轮换中最小的值将该轮换中其他位置归位。

思路貌似很正确,但看下这个样例[1,5,4,2,3],其轮换为(1)(5,3,4,2),按上述方法得到ans=18,但实际上ans=17,17怎么来的呢?我们把1换入第二个轮换中,将2暂时换出,然后再进行第二个轮换的归位,最后再把1换出去,就实现了另一种更优。这个方法其实是通过将所有数中最小的和当前轮换中最小的进行对换,这个操作虽然增加了两倍的代价,但更小的值进入当前轮换可能会造成超过这个代价的节约。所以,每次对一个轮换进行操作时,进行上述两种策略,最后选择更优的加入答案即可。细节看代码吧。


代码:

#include <algorithm>
#include <string.h>
#include <cstdio>
#define LL long long
using namespace std;
const int maxn = 10005;
struct node
{
	int id, val;
	bool operator<(const node &k)const
	{
		return val < k.val;
	}
} pos[maxn];
int vis[maxn];
int main()
{
	int n, x; 
	scanf("%d", &n);
	LL ans = 0, now1, now2;
	for(int i = 1; i <= n; ++i)
	{
		scanf("%d", &x);
		pos[i].id = i;
		pos[i].val = x;
	}
	sort(pos+1, pos+n+1);	//根据权值排序找到当前相应的置换 
	memset(vis, 0, sizeof vis);
	for(int i = 1; i <= n; ++i)
	{
		if(vis[i]) continue;
		vis[i] = 1;
		now1 = now2 = 0;
		LL val = pos[i].val;
		int t = pos[i].id;
		while(t != i)
		{
			vis[t] = 1;
			now1 += (val+pos[t].val);
			t = pos[t].id;
		}
		now2 += (pos[1].val+val)*2;
		val = pos[1].val;
		t = pos[i].id;
		while(t != i)
		{
			vis[t] = 1;
			now2 += (val+pos[t].val);
			t = pos[t].id;
		}
		ans += min(now1, now2);	//取更优策略 
	}
	printf("%lld\n", ans);
	return 0;
}


继续加油~

相关文章:

  • php对gzip文件或者字符串解压实例参考
  • POJ-1637 Sightseeing tour(通过网络流判定混合图的欧拉回路)
  • 哈密顿图和欧拉图知识小结
  • POJ-2689 Prime Distance(区间素数筛--经典题)
  • c语言移位操作
  • HDU-6069 Counting Divisors - 2017 Multi-University Training Contest - Team 4(分解质因子区间筛法)
  • HDU-6073 Matching In Multiplication - 2017 Multi-University Training Contest - Team 4(拓扑+连通块处理)
  • 我的Java开发学习之旅------Java经典排序算法之插入排序
  • POJ-3352 Road Construction(边双连通分量+缩点)
  • 445port入侵详细解释
  • UVALive-5013 Similarity(二分图最大权匹配)
  • Cisco ASA-ASA 8.2-L2L ***
  • HDU-3440 House Man(差分约束系统)
  • 怎么安装docker registry
  • HDU-3666 THE MATRIX PROBLEM(差分约束系统判断存在与否+特殊剪枝)
  • 分享的文章《人生如棋》
  • 【面试系列】之二:关于js原型
  • 03Go 类型总结
  • CentOS从零开始部署Nodejs项目
  • DataBase in Android
  • Javascript编码规范
  • Linux中的硬链接与软链接
  • nfs客户端进程变D,延伸linux的lock
  • Redux系列x:源码分析
  • Vue 2.3、2.4 知识点小结
  • 翻译:Hystrix - How To Use
  • 观察者模式实现非直接耦合
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 马上搞懂 GeoJSON
  • 浅谈web中前端模板引擎的使用
  • 消息队列系列二(IOT中消息队列的应用)
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (+4)2.2UML建模图
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (二)Linux——Linux常用指令
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (已解决)什么是vue导航守卫
  • (转)Google的Objective-C编码规范
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(七):PC端从手机内复制文件到本地
  • @ComponentScan比较
  • @拔赤:Web前端开发十日谈
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [《百万宝贝》观后]To be or not to be?
  • [android学习笔记]学习jni编程
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BIZ] - 1.金融交易系统特点
  • [Codeforces] probabilities (R1600) Part.1
  • [flask]http请求//获取请求头信息+客户端信息
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [Linux]创建新用户并授予root权限