Educational Codeforces Round 96(Div。2の評価)C。ホワイトボードの数値(欲張りアルゴリズム(水問題))

トピックリンク: ポータルトピックを投稿します

ここに画像の説明を挿入

質問の意味: 1-nの数を与えると、aとbなどの2つの異なる位置で数を組み合わせることができ、合成数は(a + b)/ 2になり、結果は丸められます。配列の最後に配置し、元のaとbを削除します。たとえば、
ここに画像の説明を挿入2つずつマージします。最終的な合成後、配列に1つの数値が残っている必要があります。マージして最後の数値を作成する方法を尋ねます。最小の数値、最小の数値を出力、2つの数値を組み合わせて出力

アイデア:最後から毎回、ペアでマージします。これは間違いなく最小であり、このマージの最小値が唯一の答えです(理由はわかりません。いくつかの例を書いて手動で試してください)。最小数は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);
    }
}

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/YSJ367635984/article/details/109058354