BZOJ1119[POI2009]SLO BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
Problem J: [POI2009]SLO
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 622 Solved: 302
[Submit][Status][Discuss]
Description
对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若干次交换的代价为每次交换的代价之和。请问将(ai)变为(bi)所需的最小代价是多少。
Input
第一行N。第二行N个数表示wi。第三行N个数表示ai。第四行N个数表示bi。 2<=n<=1000000 100<=wi<=6500 1<=ai,bi<=n ai各不相等,bi各不相等 (ai)<>(bi) 样例中依次交换数字(2,5)(3,4)(1,5)
Output
一个数,最小代价。
Sample Input
2400 2000 1200 2400 1600 4000
1 4 5 3 6 2
5 3 2 4 6 1
Sample Output
HINT
题解:想到置换,发现在一个循环中,我们尽量让每个点与权值小的进行交换,但是这样会是最优吗?
显然不是,我们忽略一种情况,我们可以将另一个循环中的一个最小的值与一个循环的一个节点交换,
然后重复上述操作,再将它换回原来循环来产生更优的解!
细节见代码:
BZOJ1119
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #define ll long long #define inf 0x7fffffff #define N 1000010 using namespace std; int n; ll v[N],minn=inf,a[N],ans; int cnt[N]; bool vis[N]; ll read() {ll x=0,f=1; char ch;while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1;while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9');return x*f; } int main() {n=read();for (int i=1; i<=n; i++) v[i]=read(),minn=min(minn,v[i]);for (int i=1; i<=n; i++) a[i]=read();for (int i=1; i<=n; i++) cnt[read()]=i;for (int i=1; i<=n; i++){if (!vis[i]){ll t=0,mn=inf,sum=0; int j=i;while (!vis[j]){vis[j]=1; t++; sum+=v[a[j]]; mn=min(mn,v[a[j]]); j=cnt[a[j]]; }if (t>=2){ll t1=sum+1ll*mn*(t-2),t2=sum+mn+1ll*minn*(t+1);ans+=min(t1,t2); }}} printf("%lld\n",ans);return 0; }
View Code
BZOJ1697
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #define ll long long 7 #define inf 0x7fffffff 8 #define N 100005 9 using namespace std; 10 struct point{ 11 ll v,pos; 12 }tmp[N]; 13 ll v[N],minn=inf,a[N],ans; 14 int cnt[N]; 15 bool vis[N]; 16 ll read() 17 { 18 ll x=0,f=1; char ch; 19 while (ch=getchar(),ch<'0'||ch>'9') if (ch=='-') f=-1; 20 while (x=x*10+ch-'0',ch=getchar(),ch>='0'&&ch<='9'); 21 return x*f; 22 } 23 bool cmp(point a,point b){return a.v<b.v; 24 } 25 int main() 26 { 27 int n=read(); 28 for (int i=1; i<=n; i++) v[i]=tmp[i].v=read(),a[i]=tmp[i].pos=i,minn=min(minn,tmp[i].v); 29 sort(tmp+1,tmp+n+1,cmp); 30 for (int i=1; i<=n; i++){cnt[tmp[i].pos]=i;} 31 for (int i=1; i<=n; i++) 32 { 33 if (!vis[i]) 34 { 35 ll t=0,mn=inf,sum=0; int j=i; 36 while (!vis[j]) 37 { 38 vis[j]=1; t++; sum+=v[a[j]]; mn=min(mn,v[a[j]]); j=cnt[a[j]]; 39 } 40 if (t>=2) 41 { 42 ll t1=sum+1ll*mn*(t-2),t2=sum+mn+1ll*minn*(t+1); 43 ans+=min(t1,t2); 44 } 45 } 46 } 47 printf("%lld\n",ans); 48 return 0; 49 }
View Code
转载于:https://www.cnblogs.com/HQHQ/p/5952992.html
BZOJ1119[POI2009]SLO BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序相关推荐
- bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序(置换)
1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 706 Solved: 413 ...
- BZOJ 1631: [Usaco2007 Feb]Cow Party【最短路】
1631: [Usaco2007 Feb]Cow Party [题目描述] 传送门 题解 正向建边,从X开始刷一趟SPFA,然后反向建边,从X刷一趟SPFA,最后两次的答案加和就可以了. 代码如下 # ...
- poj 3268 bzoj 1631: [Usaco2007 Feb]Cow Party(最短路)
1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MB Submit: 855 Solved: 613 [Subm ...
- [Usaco2007 Feb]Cow Party 奶牛派对
好了,好久没发题解,这次来一发SPFA,看题: Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向 路连 ...
- P5200 [USACO19JAN]Sleepy Cow Sorting 牛客假日团队赛6 D 迷路的牛 (贪心)
链接:https://ac.nowcoder.com/acm/contest/993/E 来源:牛客网 对牛排序 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(DP)
1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 633 Solved ...
- 1696: [Usaco2007 Feb]Building A New Barn新牛舍
1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 378 So ...
- bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)
1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 550 Solved: 1 ...
- bzoj 1696: [Usaco2007 Feb]Building A New Barn新牛舍
1696: [Usaco2007 Feb]Building A New Barn新牛舍 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 481 Solv ...
- bzoj 1632: [Usaco2007 Feb]Lilypad Pond(BFS)
1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec Memory Limit: 64 MB Submit: 688 Solved: 230 [S ...
最新文章
- python序列_科学网—Python:序列(字符串、列表、元组)和序列函数 - 刘洋洋的博文...
- C语言——日常刷题(一)
- node更新到最新版本_云顶之弈10.24版本临时更新永恩、劫大砍,最新上分阵容推荐...
- javascript 卸载事件(onunload)
- QT的QPlace类的使用
- python 的datetime模块使用
- NLP太难学了!?吃透NLP的方法来拿走
- SDN精华问答 | 为什么会出现SDN?
- java发送http post请求报文_Java 用HTTP的方式发送JSON报文请求
- 阿里云、腾讯云、华为云哪个好?迄今最全面的云服务评测报告出炉(转)
- android 获取高德地图坐标,获取地址描述数据-获取地图数据-开发指南-Android 地图SDK | 高德地图API...
- svn up出现类似svn: Error converting entry in directory ‘.‘ to UTF-8问题解决
- 开源的屏幕画笔工具(基于WPF InkCanvas)
- java如何让图片自适应屏幕_CSS实现背景图片屏幕自适应
- CAD插件的安装和自动加载dll、arx
- 用HTML写出能转换成合适的PDF文件(A4纸张大小)的相关问题和方法
- 优化移动网站的9大窍门(转)
- Mysql-explain-Impossible WHERE noticed after reading const tables
- 什么是政微助手?政微助手是干什么用的?
- 大学计算机基础 教学要求,《大学计算机基础》课程教学大纲