题目链接: 传送门
题目贴上:
题意:,给你 1-n个数,你可以对两个不同位置的数进行合并,比如a和b,合成数变成(a+b)/2,结果四舍五入。放在数组末尾,删除原来的a和b,举例子吧
就这样子两两合并,最后合成后数组肯定就剩下一个数字,问你怎么合并使最后一个数字最小,输出最小数,并且输出每次合并的两个数
思路: 每次从最后开始,两两合并,肯定最小,而且这样子合并最小值答案是唯一的(不知道为什么的直接手动写几个例子试一试,)而且最小数固定为2.
#include<bits/stdc++.h>
namespace mySpace{
typedef long long int ll;
typedef long double ld;
typedef double db;
//typedef __int64 int bi;
//nth_element(first,pos,end) =>STL function ,求第pos小的元素
#define fori(a,b,c) for(int a=b;a<=c;++a)
#define me(a) memset(a,0,sizeof a)
#define Mod 1000000009
#define exp 1e-8
#define fi first
#define se second
#define sc_int(x) scanf("%d",&x)
#define sc_db(x) scanf("%lf",&x)
#define sc_str(x) scanf("%s",x)
#define sc_bi(x) scanf("%I64d",&x)
#define pr_int(x) printf("%d\n",x)
#define pr_bi(x) printf("%lld\n",x)
const int INF = 0x7fffffff;
const int MAX1 = 2e5+10;
const int MAX2 = 1e6+10;
const int MAX3 = 2e6+10;
//#define IS std::ios::sync_with_stdio(false)
//#define OS std::cin.tie(NULL)
void readFoler()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
}
void closeFoler()
{
fclose(stdin);
fclose(stdout);
}
}
using namespace std;
using namespace mySpace;
ll a[MAX1];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
puts("2");
printf("%d %d\n",n,n-1);
for(int i=n;i>=3;--i)
printf("%d %d\n",i,i-2);
}
}