ACM PKU 1455 Crazy tea party 逆序数 简单的数学题

http://acm.pku.edu.cn/JudgeOnline/problem?id=1455

如果所有人是线性排列,那我们的工作就是类似冒泡程序做的工作,,1,2,3,4,5变为5,4,3,2,1 ,耗时n(n-1)/2
但是出现了环,也就是说1,2,3,4,5变为3,2,1,5,4也可满足条件  
我们可以把这个环等分成两个部分 ,每个部分看成是线性的,再把它们花的时间加起来.
当n是偶数时, 每份人数n/2 ,即 (n/2-1)*(n/2)*2
当n是偶数时,两份的人数分别是n/2和n-n/2,即(n/2-1)*(n/2)+ ((n-n/2)-1)*(n-n/2)/2
适当化简,得到以下程序

Source

Problem Id:1455  User Id:lnmm
Memory:88K  Time:0MS
Language:C++  Result:Accepted

  • Source

 1#include"iostream.h"
 2
 3void main()
 4{
 5    int T;
 6    int n;
 7    int temp;
 8    int a,b;
 9    cin>>T;
10    while(T--)
11    {
12        cin>>n;
13        if(n%2==0)
14        {
15            temp=(n/2-1)*n/2;        
16        }

17        else 
18        {
19            a=n/2;
20            b=n-n/2;
21            temp=((a-1)*a+(b-1)*b)/2;
22
23        }

24        cout<<temp<<endl;
25
26    }

27}

posted on 2007-09-16 03:02 流牛ζ木马 阅读(1371) 评论(4)  编辑 收藏 引用

评论

# re: ACM PKU 1455 Crazy tea party 逆序数 简单的数学题 2008-01-31 02:14 mcfaddan

这个方法很巧妙哦~~
顶个。  回复  更多评论   

# re: ACM PKU 1455 Crazy tea party 逆序数 简单的数学题 2008-08-07 18:44 mxx

奇数时,可以把它加1,变成偶数,再减去(n/2-1)次
else
{
n++;
temp=(n/2-1)*n/2-(n/2-1);
}
  回复  更多评论   

# re: ACM PKU 1455 Crazy tea party 逆序数 简单的数学题 2009-11-02 14:45 carnie

那把偶数当做奇数来算应该是得到同样的结果吧。  回复  更多评论   

# re: ACM PKU 1455 Crazy tea party 逆序数 简单的数学题 2010-06-02 02:57 dong

当n是偶数时, 每份人数n/2 ,即 (n/2-1)*(n/2)*2????????  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

导航

统计

公告

MY Email/MSN :mars1021@163.com QQ : 27402040 流牛ζ木马

常用链接

留言簿(6)

随笔档案

相册

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜