题目网址:http://poj.org/problem?id=3270

题目大意是:一串无序的数字,要排成增序的数列,可以交换不相邻的数,每交换两个数,sum+这两个数,使得sum最小,求最小的sum。

0 ms

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. using namespace std;
  6. class A
  7. {
  8. public:
  9. int v; //数字
  10. int n; //初始位置
  11. bool visit;
  12. }p[];
  13. bool cmp(const A &a,const A &b)
  14. {
  15. return a.v<b.v;
  16. }
  17. int main(){
  18. int n,m,i,j,Min,Max,Mmin,x,y,t,sum,ans2,ans1,ans,num;
  19. while (~scanf("%d",&n))
  20. {
  21. for (i=;i<=n;i++)
  22. {
  23. scanf("%d",&p[i].v);
  24. p[i].n=i;
  25. p[i].visit=;
  26. }
  27. sort(p+,p+n+,cmp);
  28. Min = p[].v;
  29. Max = p[n].v; //最小数的初始位置,最大数的初始位置
  30. ans = ; //总和
  31. for (i=;i<=n;i++)
  32. {
  33. Mmin = Max*;
  34. sum = ;
  35. t = i;
  36. num = ;
  37. while (p[t].visit==) //找到一个环
  38. {
  39. num ++; //构成环的数的数量
  40. sum += p[t].v;
  41. Mmin = min(Mmin,p[t].v); //找到这个环里初始位置最靠前的位置
  42. p[t].visit = ; //标记
  43. t = p[t].n;
  44. }
  45. if (num > )
  46. {
  47. ans1 = sum + (num-)*Mmin;
  48. ans2 = sum + Mmin + (num+)*Min;
  49. ans += min(ans1,ans2);
  50. }
  51. }
  52. printf("%d\n",ans);
  53. }
  54. return ;
  55. }

详解:http://www.cnblogs.com/xin-hua/archive/2013/07/29/3222651.html

另在HDU,也有一道类似的题,但是它限制了,只有相邻的两个数才能交换。

网址:http://acm.hdu.edu.cn/showproblem.php?pid=2838

树状数组做

31 ms

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. using namespace std;
  5. const int N=,maxn=;
  6. int ccnt[N];
  7. __int64 csum[N]; //在自己之前比自己小的数
  8. int lowbit(int x)
  9. {
  10. return x&(-x);
  11. }
  12. int main()
  13. {
  14. int n,x;
  15. while (~scanf("%d",&n))
  16. {
  17. memset(ccnt,,sizeof(ccnt));
  18. memset(csum,,sizeof(csum));
  19. int scnt=;
  20. __int64 ssum=,ans=;
  21. while (n--)
  22. {
  23. scanf("%d",&x);
  24. scnt++; ssum+=x;
  25. for(int i=x;i<=maxn;i+=lowbit(i))
  26. ccnt[i]++, csum[i]+=x; //更新csum[i]的值,ccnt[i]为csum[i]的子的个数
  27. int cnt=;
  28. __int64 sum=;
  29. for(int i=x;i>;i-=lowbit(i))
  30. cnt+=ccnt[i], sum+=csum[i]; //sum在x之前比x小的数的和,在x之前比x小的数的个数
  31. ans+=ssum-sum+(__int64)x*(scnt-cnt);
  32. }
  33. printf("%I64d\n",ans);
  34. }
  35. return ;
  36. }

Cow Sorting POJ 3270 & HDU 2838的更多相关文章

  1. hdu 2838 Cow Sorting(树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  2. Cow Sorting hdu 2838

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. hdu 2838 Cow Sorting (树状数组)

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  6. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  7. poj 3270(置换群)

    题意:给定n头母牛的脾气大小,然后让你通过交换任意两头母牛的位置使得最后的母牛序列的脾气值从小到大,交换两头母牛的代价是两个脾气之和,使得代价最小. 分析:以前做过一道题,只有一个地方和这道题不同,但 ...

  8. BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序

    1697: [Usaco2007 Feb]Cow Sorting牛排序 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 215[S ...

  9. Cow Sorting(置换群)

    Cow Sorting Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6664   Accepted: 2602 Descr ...

随机推荐

  1. bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘【凸包】

    凸包模板 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> ...

  2. python使用ddt模块对用例执行操作

    import time import unittest import ddt from selenium import webdriver TEST_URL = "http://www.ba ...

  3. 莫队算法 Gym - 100496D Data Mining

    题目传送门 /* 题意:从i开始,之前出现过的就是之前的值,否则递增,问第p个数字是多少 莫队算法:先把a[i+p-1]等效到最前方没有它的a[j],问题转变为求[l, r]上不重复数字有几个,裸莫队 ...

  4. redis在linux环境下的安装与启动

    定义 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted s ...

  5. Xml学习笔记(2)

    不同的xml文档构可能要用到不同的方法进行解析这里用到的是例如<student name="张三" id="1" sex="男"/&g ...

  6. 什么是2MSL以及TIME_WAIT的作用

    TIME_WAIT主要是用来解决以下几个问题: 1)上面解释为什么主动关闭方需要进入TIME_WAIT状态中提到的: 主动关闭方需要进入TIME_WAIT以便能够重发丢掉的被动关闭方FIN包的ACK. ...

  7. A8ERP配送管理系统

  8. Android基础TOP6_1:FrameLyayout和ImageView制作层叠图片

    Activity: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  9. Microsoft SQL Server学习(五)--操作符聚合函数

    算术运算符 逻辑运算符 比较运算符 聚合函数 算术运算符(+ - * / ) select score*2 as 成绩翻倍 from class_A update class_A set score= ...

  10. Windows 2008 防火墙开放端口

    当我们使用新服务器架设新主机时,经常会遇到网站无法访问的情况,当问及客服时,经常会告知,操作系统默认不打开80端口,请先确定80是否打开并确定没有被占用.那么,我们该如何打开80端口呢? 方法/步骤 ...