• bzoj1697:[Usaco2007 Feb]Cow Sorting牛排序 & bzoj1119:[POI2009]SLO


    思路:以bzoj1119为例,题目已经给出了置换,而每一次交换的代价是交换二者的权值之和,而置换一定是会产生一些环的,这样就可以只用环内某一个元素去置换而使得其余所有元素均在正确的位置上,显然要选择环内最小的数,但也可能存在一个数使得它不在当前处理的环内而它先与当前环内某个数进行交换,然后再在环内进行交换,再将之前那个数换回来,这样也显然要选择所有元素中最小的和当前环内最小的进行交换,然后取个min即可。然后还要注意可能当前环内最小的就是所有元素中最小的,特判一下即可。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 #define maxn 1000100
     8 #define inf 1e9
     9  
    10 int n,minval=inf,tot;
    11 long long ans;
    12 int a[maxn],pos[maxn],b[maxn],val[maxn],next[maxn];
    13 bool vis[maxn];
    14  
    15 int read(){
    16     int x=0,f=1;char ch=getchar();
    17     for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
    18     for (;ch>='0' && ch<='9';ch=getchar()) x=x*10+ch-'0';
    19     return x*f;
    20 }
    21  
    22 int main(){
    23     n=read();
    24     for (int i=1;i<=n;i++) val[i]=read(),minval=min(minval,val[i]);
    25     for (int i=1;i<=n;i++) a[i]=read(),pos[a[i]]=i;
    26     for (int i=1;i<=n;i++) b[i]=read(),next[pos[a[i]]]=pos[b[i]];
    27     for (int i=1;i<=n;i++)
    28         if (!vis[i]){
    29             long long sum=0;int size=0,v=inf;
    30             while (!vis[i]) vis[i]=1,size++,sum+=val[a[i]],v=min(v,val[a[i]]),i=next[i];
    31             if (size<=1) continue;
    32             long long ans1=sum-v+1ll*v*(size-1),ans2=sum+v+1ll*minval*(size+1);
    33             if (v!=minval) ans+=min(ans1,ans2);else ans+=ans1;
    34         }
    35     printf("%lld
    ",ans);
    36 } 
    bzoj1119
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 #define maxn 100100
     8 #define inf 1e9
     9  
    10 int n,minval=inf,ans;
    11 int tmp[maxn],val[maxn],pos[maxn],next[maxn];
    12 bool vis[maxn];
    13  
    14 int read(){
    15     int x=0,f=1;char ch=getchar();
    16     for(;ch<'0' || ch>'9';ch=getchar())if (ch=='-') f=-1;
    17     for(;ch>='0' && ch<='9';ch=getchar()) x=x*10+ch-'0';
    18     return x*f;
    19 }
    20  
    21 int main(){
    22     n=read();
    23     for (int i=1;i<=n;i++) tmp[i]=val[i]=read(),pos[val[i]]=i,minval=min(minval,val[i]);
    24     sort(tmp+1,tmp+n+1);
    25     for (int i=1;i<=n;i++) next[pos[tmp[i]]]=pos[val[i]];
    26     for (int i=1;i<=n;i++){
    27         int sum=0,size=0,v=inf;
    28         while (!vis[i]) vis[i]=1,size++,sum+=val[i],v=min(v,val[i]),i=next[i];
    29         if (size<=1) continue;
    30         int ans1=sum+v*(size-2),ans2=sum+minval*(size+1)+v;
    31         if (minval!=v) ans+=min(ans1,ans2);else ans+=ans1;
    32     }
    33     printf("%d
    ",ans);
    34     return 0;
    35 }
    bzoj1697
  • 相关阅读:
    解决Maven依赖本地仓库eclipse报错的问题
    PowerDesigner连接MySQL和逆向工程图
    《Head First Java》读书笔记(2)
    微信公众号开发 [02] 本地测试环境搭建
    微信公众号开发 [01] 入门基本流程
    IDEA运行编译后配置文件无法找到,或配置文件修改后无效的问题
    log4j的基本使用和参数设定
    06jQuery-06-AJAX
    06jQuery-05-事件
    06jQuery-04-DOM操作
  • 原文地址:https://www.cnblogs.com/DUXT/p/5951450.html
Copyright © 2020-2023  润新知