POJ-Crazy tea party,很好的一道数学题~~~

Crazy tea party

Time Limit: 1000MS   Memory Limit: 10000K
      

Description

n participants of << crazy tea party >> sit around the table. Each minute one pair of neighbors can change their places. Find the minimum time (in minutes) required for all participants to sit in reverse order (so that left neighbors would become right, and
right - left).

Input

The first line is the amount of tests. Each next line contains one integer n (1 <= n <= 32767) - the amount of crazy tea participants.

Output

For each number n of participants to crazy tea party print on the standard output, on a separate line, the minimum time required for all participants to sit in reverse order.

Sample Input

3
4
5
6

Sample Output

2
4
6

Source

Southeastern Europe 2003

题意很简单,n个人(1~n)围坐在一张桌子上,每分钟相邻两个人可以互换位置,求最少需要几分钟使得顺序变为逆序;

貌似普通思路没什么突破点,单纯找规律也找不出,但是我们可以发现题目只要求最后顺序为逆序,但没有指明位置不可以变;假如有5个人:1 2 3 4 5;变换之后是 3 2 1 5 4;明白了吧,结果只要是逆序排列就可以了,开始编号为1的人的位置可以任意,但一旦确定1的位置两边的位置就已经确定;假如最后1在编号为k的位置上,那么最后k就在开始编号为1的位置上,顺序就变成了:k~1、n~k+1;这样也是逆序的;

我们知道一个冒泡排序需要变换n*(n-1)/2;这里就可以分为两部分,1~k变换,需要变换k*(k-1)/2,剩下的n-k个数需要变换(n-k)*(n-k-1)/2;总共就是k*(k-1)/2+(n-k)*(n-k-1)/2;分解变成:k^2-nk+(n*n-n)/2;n为人数已知,求这个二元方程的最小值用(4ac-b^2)/4a;得答案为n/2*(n/2-1);但对于n的奇偶未知,思路已经提供到这了,奇偶问题应该不难解决;看代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int t,n;
    scanf("%d",&t);
     while(t--)
     {
         scanf("%d",&n);
         if(n%2==0)
         printf("%d\n",n/2*(n/2-1));
         else
            printf("%d\n",n/2*((n+1)/2-1));
     }
            return 0;
}
时间: 2024-10-10 15:10:40

POJ-Crazy tea party,很好的一道数学题~~~的相关文章

《Crazy tea party》

Description n participants of ?crazy tea party? sit around the table. Each minute one pair of neighbors can change their places. Find the minimum time (in minutes) required for all participants to sit in reverse order (so that left neighbors would be

FZOJ 1157 Crazy Tea Party

OJ题目:click here~~ 题目分析:1--n按顺序围成一个圈,1与n相邻.交换相邻两个数算1步.至少需要多少步,得到一个逆方向的1--n的圈. 分两半,使用冒泡排序,排成逆序的交换次数之和即为结果. AC_CODE int f(int n){ return n*(n - 1)/2; } int main(){ int n , t; cin >> t; while(t--){ cin >> n; int ans = 0; if(n&1) ans = f(n/2) +

[摸鱼]一道数学题

被一道数学题缠住啦! 遇到这种情况当然是要上网找答案啦! 但找到的每一个答案我都看不懂怎么办? 那就自己死磕吧! 题目: $f(x)=x^2+px+q$,若$f(f(x))=0$只有一个实根,求证:$p,q\geq0$ 以下是我的口胡证明,欢迎纠错. 首先$f(x)=0$肯定要有根,$\triangle\geq0\Rightarrow p^2-4q\geq0\qquad(1)$ 然后转化一下原问题:$\left\{\begin{align*}t=f(x)\\f(t)=0\end{align*}\

POJ 1064 Cable master(很好玩的二分搜索)

Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24292   Accepted: 5200 Description Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Committee has volunteered and has promised to

---------很简单的 一道 堆栈问题-------

1098: 括号配对问题 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 [提交][状态][讨论版] 题目描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")&quo

HDU 3038 How Many Answers Are Wrong 很有意思的一道并查集问题

题目大意:TT 和 FF玩游戏(名字就值五毛),有一个数列,数列有N个元素,现在给出一系列个区间和该区间内各个元素的和,如果后出现的一行数据和前面一出现的数据有矛盾,则记录下来.求有矛盾数据的数量. 题目思路:刚刚拿到手时一脸懵逼,这是并查集?后来发现还真是并查集 - -!! 如果数据有错那么会是什么情况? 1-10 10 1-5   5 6-10  4 很明显第三行的数据和已知的数据产生了矛盾,我们分析一下矛盾是如何产生的. 我们用v[i]来统计最右端为i的区间和,那么: 第一行数据得知v[1

POJ 2501 Average Speed(不错的一道水题)

[题目简述]:给出我们时间和速度,让我们求出走了多远的距离 [分析]:这道题开始的时候没有太明白什么时候输出,后来看了别人的题解就明白了. 关于此题的几点总结: 1.时间的输入方法:scanf("%d:%d:%d",&h,&m,&s),注意积累! 2.关于空格的的输入控制使用char ch = getchar(),同时它还作为了本题的一个是否输出的标识控制的条件. 3.多积累类似题目的方法. 代码参考http://blog.csdn.net/yujuan_mao

uva1315 Crazy tea party(找规律)

题意就是说把顺时针排的1到n换成逆时针排的需要的最少交换步数. 如果是线形的一串数,需要的交换次数就是个冒泡排序的交换次数:n*(n-1)/2,或者用a[i]=(i-1)+a[i-1]推出来. 对于环形,切成两个线形就行了,通过观察规律知:越接近平均切开越好. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #incl

UVA1315 - Crazy tea party(推导)

题目链接 题意:n个人坐成环形,相邻的两个可以交换位置,求最少交换次数使得序列相反. 思路:类似与冒泡排序,可以将环形序列拆成两个序列,分别进行冒泡.当n为奇数时,分为n/2与n/2 + 1,所以ans = (n / 2) * (n / 2 - 1) / 2 + (n / 2) * (n / 2 + 1) / 2,当n为偶数时,分为两个n/2, 所以ans = (n / 2) * (n / 2 - 1). 代码: #include <iostream> #include <cstdio&