博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
阅读量:5089 次
发布时间:2019-06-13

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

Problem J: [POI2009]SLO

Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 622  Solved: 302
[][][]

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

6
2400 2000 1200 2400 1600 4000
1 4 5 3 6 2
5 3 2 4 6 1

Sample Output

11200

HINT

题解:想到置换,发现在一个循环中,我们尽量让每个点与权值小的进行交换,但是这样会是最优吗?

   显然不是,我们忽略一种情况,我们可以将另一个循环中的一个最小的值与一个循环的一个节点交换,

   然后重复上述操作,再将它换回原来循环来产生更优的解!

   细节见代码:

BZOJ1119

#include
#include
#include
#include
#include
#define ll long long #define inf 0x7fffffff#define N 1000010using 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
2 #include
3 #include
4 #include
5 #include
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
=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

你可能感兴趣的文章
微服务部分面试题
查看>>
Cookie和Session和Cache(转)
查看>>
关于网站登录后的页面操作所携带的不同cookie值
查看>>
CookieJar转换成不同的数据格式
查看>>
浅谈python之利用pandas和openpyxl读取excel数据
查看>>
冒泡排序和sort,sorted排序函数
查看>>
configparser读取配置文件时的相对路径问题
查看>>
关于Git和GitHub的一些知识
查看>>
python中可变与不可变类型的全局变量
查看>>
浅谈python面向对象编程和面向过程编程的区别
查看>>
十五夜望月寄杜郎中
查看>>
【转】单元测试、接口测试、功能测试的区别
查看>>
浅谈python中selenium库调动webdriver驱动浏览器的实现原理
查看>>
关于AttributeError: 'NoneType' object has no attribute 'send_keys'
查看>>
linux上安装jenkins过程
查看>>
jenkins添加节点
查看>>
通过华为云搭建一个属于自己的小网站
查看>>
windows和linux下查看java安装路径
查看>>
浅谈动态规划
查看>>
微信小程序中使用text-indent实现首行缩进
查看>>