回 帖 发 新 帖 刷新版面

主题:[讨论]ACM牛人的进来,一道恶心我的题目

题目如下:
SuperRock和诺曼底登陆
Submit: 463   Accepted:156
Time Limit: 1000MS  Memory Limit: 65536K
Description
这是一个有关于诺曼底登陆战中军官SuperRock中校的故事。SuperRock中校手下有 N(1 <= N <= 10,000)个士兵。可是他们的脾气都不好,脾气大的士兵有可能会捣乱。聪明的SuperRock中校打算把士兵按脾气的大小排排队。每一个士兵的脾气都是一个在1到100,000之间的整数并且没有两个士兵的脾气值相同。在排序过程中,SuperRock可以交换任意两个士兵的位置。因为脾气大的士兵不好移动,SuperRock需要X+Y秒来交换脾气值为X和Y的两个士兵。
时间已经差不多了,尽管SuperRock还是一个不错的程序爱好者,可是他的笔记本坏了,来不及修好。作为有天赋的而且热心的编程高手,请你帮SuperRock计算把所有士兵排好序的最短时间.

Input
第1行: 一个数, N。
第2~N+1行: 每行一个数,第i+1行是第i个士兵的脾气值

Output
第1行: 一个数,把所有士兵排好序的最短时间。



Sample Input

3
2
3
1

Sample Output

7

Hint
输入解释:
队列里有三个士兵,脾气分别为 2,3, 1。
输出解释:
2 3 1 : 初始序列
2 1 3 : 交换脾气为3和1的士兵(时间=1+3=4). 
1 2 3 : 交换脾气为1和2的士兵(时间=2+1=3).

Source
Moyuji@Bupt
我做了提交过就是WA,但我认为我的算法没有问题!2个小时后我会发我的代码,先求高手赐教!谢了,牛人门!!

回复列表 (共9个回复)

沙发

将数据装入map,key为脾气值,value为下标。
然后从最小的开始,让他向左移动,移动的规则是找出左侧比他大的最大值进行下标交换。

板凳

3 4 1 2      time

3 2 1 4       6
1 2 3 4       4

找出最大值 与最右边SWAP,递归执行

3 楼

嗯,貌似楼上的对的,我的是错的~~~~~

4 楼


LS上的你好,很高兴你能看我的题目。
但是测试数组如果是1 8 9 7 6的话
按你的说法花时间为:
9换6:1 8 6 7 9;
8换7:1 7 6 8 9;
6换7:1 6 7 8 9;
耗时为:15+15+13=43;
但其实最好的为:
1换6:6 8 9 7 1;
1换9:6 8 1 7 9;
1换7:6 8 7 1 9;
1换8:6 1 7 8 9;
1换6:1 6 7 8 9;
答案为:7+10+8+9+7=41;
这个怎么说?

5 楼

寻找中国的最优秀的网商领袖精英  
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

6 楼


#include <iostream>
using namespace std;

int main()
{
    int n,k;
    int sum=0;
    int max,tem;
    cin>>n;
    if (n<0 || n>10000)
    {
        cout<<"n is not in the range"<<endl;
    }
    int a[9999];
    for(int i=0;i<n;i++)
    {
        cin>>k;
        if (k<0||k>100)
        {
            cout<<"there is a wrong infomation.";
            break;
        }
        a[i]=k;
    }
    for(i=0;i<n;i++)
    {
        max=a[0];
        for(int j=0;j<n;j++)
        {
            if(max<a[j])
            {
                tem=max;
                max=a[j];
                a[j]=tem;
                sum=sum+max+a[j];
            }
        }
    }
    cout<<sum<<endl;
}

7 楼

lz,这题可能是 排序找环。
例如 1 6 2 4; 排序后 1 2 4 6;
环有两个:1;6 2 4;
对每个环,要交换(设环的元素个数为k)k-1次,则有2(k-1)个元素(包含重复)参与交换,可以肯定每个元素至少交换一次,则如果剩下的2k-2-k = k-2次都是值最小的元素占用,那么这样达到的值应该是最少的。所以2和4交换,2再和6交换。这种交换方式应该是正确的吧。

8 楼

www.bcwhy.com

9 楼

怎么将自己写的传给ACM啊,在什么地址提交……

我来回复

您尚未登录,请登录后再回复。点此登录或注册