牛客(多校3):Points Construction Problem

在这里插入图片描述
在这里插入图片描述
示例1:
输入

6
5 20
1 2
1 3
1 4
1 5
3 8

输出

Yes
1 1
2 2
3 3
4 4
5 5
No
No
Yes
1 1
No
Yes
1 1
1 2
2 1

在这里插入图片描述
代码:
方法1

#pragma GCC optimize(2)//编译优化
#pragma GCC optimize(3)
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll T,n,m,i,j,k,l,o,p,a[10010][10010];
int main()
{
    for(scanf("%lld",&T);T--;)
    {
        scanf("%lld%lld",&n,&m);
        if(m&1||m>4*n||n*16>m*m) puts("No");
        else
        {
            puts("Yes");
            if (m>2*n+2)
            {
                o=(m-(2*n+2))/2;p=n-o;
                for (i=1;i<=p;i++) printf("1 %lld\n",i);
                for (i=1;i<=o;i++) printf("4 %lld\n",i*2);
            }
            else
            {
                o=m/4,p=m/2-o;
                for(i=1;i<=o;i++) printf("%lld 1\n",i);
                for(j=2;j<=p;j++) printf("1 %lld\n",j);
                l=n-(o+p-1);
                for(i=2;i<=o&&l>0;i++)
                    for(j=2;j<=p&&l>0;j++,l--)
                        printf("%lld %lld\n",i,j);
            }
        }
    }
}

方法2(较好理解)
代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    int n, m;
    while(t--)
    {
        cin >> n >> m;
        if(m > 4*n || (m&1) || (m*m < 16*n))
        {
            cout << "No" << endl;
            continue;
        }
        else if(m > 2 * n + 2)
        {
            cout << "Yes" << endl;
            int x = (m-(2*n+2))/2;
            int y = n - x;
            for(int i = 1; i <= x; i++)
            {
                cout << "1 " << 2*i <<  endl;
            }
            for(int i = 1; i <= y; i++ )
            {
                cout << "3 " << i <<  endl;      
            }
             
        }
        else
        {
            cout << "Yes" << endl;
            int x=m/4;
            int y=m/2-x;
            for(int i = 1; i <= x; i++)
            {
                cout << i << " 1" << endl;
            }
            for(int i = 2; i <= y; i++)
            {
                cout << "1 " << i << endl;
            }
             
            int rest=n-(x+y-1);
                for(int i=2;i<=x&&rest>0;i++)
                    for(int j=2;j<=y&&rest>0;j++,rest--)
                        printf("%d %d\n",i,j);
                 
        }
    }
    return 0;  
}

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107571144