Codeforces 1430C. C. Numbers on Whiteboard
原题链接
简单
作者:
蓬蒿人
,
2022-03-28 21:24:52
,
所有人可见
,
阅读 167
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
//1430C
// 题目大意
// T组数据 每组一个n
// 要求合并一个数组 数组内数为1~n
// 问以合并n-1次 最终结果最小为多少 并输出每次合并的过程
// 合并操作:删除要合并的两个数x,y 插入round((x+y)/2.0)
/*-------------------------解题思路---------------------*/
// 每次只选最大的两个数合并 因为合并的规则为四舍五入
// 所以每次只选最大的合并 会使最后的结果变小
// 值得一提的是 两个整数的四舍五入等价于上取整
// ceil 上取整 floor下取整 round四舍五入
typedef long long ll;
const int N = 1e5+10;
int T,n;
int main(){
scanf("%d", &T);
while (T--){
scanf("%d", &n);
int ans=n;
for (int i=n-1;i>=1;i--){
//ans=(ans+i+1)/2;
ans=round((ans*1.0+i)/2);
}
printf ("%d\n",ans);
ans=n;
for (int i=n-1;i>=1;i--){
printf ("%d %d\n",ans,i);
//ans=(ans+i+1)/2;
ans=round((ans*1.0+i)/2);
}
}
return 0;
}