题意:
给你 1 、 2 、 3... n 1、2、3...n 1、2、3...n一共 n n n个数,每次操作可以选择两个数 a , b a,b a,b拿出,再放入 ( a + b ) / 2 (a+b)/2 (a+b)/2(向上取整)。在 n − 1 n-1 n−1次操作后只会剩下一个数,问这个数最小是多少。
解题思路:
每一次操作,这些数的和就减少 ( a + b ) / 2 (a+b)/2 (a+b)/2,那么贪心,每次选择最大的两个数即可,并且最后答案一定是 2 2 2。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
const int mod = 1e9+7;
long long a[maxn];
int main(){
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<2<<endl;
int pr=n;
for(int i=n-1;i>0;i--)
{
printf("%d %d\n",i,pr);
pr=(i+pr+1)/2;
}
}
return 0;
}