主题:[讨论]ACM牛人的进来,一道恶心我的题目
powerforever [专家分:30] 发布于 2010-09-06 20:45:00
题目如下:
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个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2010-09-07 08:00:00
将数据装入map,key为脾气值,value为下标。
然后从最小的开始,让他向左移动,移动的规则是找出左侧比他大的最大值进行下标交换。
板凳
yjypm8460859 [专家分:970] 发布于 2010-09-07 11:29:00
3 4 1 2 time
3 2 1 4 6
1 2 3 4 4
找出最大值 与最右边SWAP,递归执行
3 楼
cgl_lgs [专家分:21040] 发布于 2010-09-07 13:03:00
嗯,貌似楼上的对的,我的是错的~~~~~
4 楼
powerforever [专家分:30] 发布于 2010-09-08 15:39:00
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] 发布于 2010-09-26 13:55:00
寻找中国的最优秀的网商领袖精英
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846
占领市场第一先机,合力打造网商系统!
淘宝商盟官网 www.taobaosm.com
http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度
6 楼
ybn187 [专家分:0] 发布于 2010-10-26 21:51:00
#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 楼
chong_boy [专家分:0] 发布于 2010-10-28 15:19:00
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 楼
小强624 [专家分:0] 发布于 2011-02-12 13:07:00
www.bcwhy.com
9 楼
iytbdwt [专家分:20] 发布于 2012-03-24 10:51:00
怎么将自己写的传给ACM啊,在什么地址提交……
我来回复