• D. Grid-00100(构造一个行列均匀的方阵)


    Problem - 1371D - Codeforces

    题意:

    你得到的是整数n,k。构建一个大小为n×n的网格A,由整数0和1组成。应该满足一个非常重要的条件:网格中所有元素的总和正好为k。

    我们来定义一下。

    Ai,j为第i行和第j列的整数。
    Ri=Ai,1+Ai,2+...+Ai,n(对于所有1≤i≤n)。
    Cj=A1,j+A2,j+...+An,j(对于所有1≤j≤n)。
    换句话说,Ri是网格A的行和,Cj是列和。 
    对于网格A,让我们定义值f(A)=(max(R)-min(R))2+(max(C)-min(C))2(这里对于一个整数序列X,我们定义max(X)为X中的最大值,min(X)为X的最小值)。
    找到任何满足以下条件的网格A。在这样的网格中找到任何一个,对于它来说,f(A)的值是可能的最小值。在这样的表格中,你可以找到任何一个。

    输入
    输入由多个测试案例组成。第一行包含一个整数t(1≤t≤100)--测试案例的数量。接下来的t行包含测试用例的描述。

    对于每个测试案例,唯一的一行包含两个整数n,k(1≤n≤300,0≤k≤n2)。

    保证所有测试用例的n2之和不超过105。

    输出
    对于每个测试案例,首先打印所有表格中f(A)的最小可能值,对该条件的满足。

    然后,打印n行,每行包含n个字符。第i行中的第j个字符应该等于Ai,j。

    如果有多个答案,你可以打印任何一个。

    题解:

    题意已经说的很明确了,让(每行最大最小与的差值平方  + 每列最大最小的差值平方)最小

    所以我们应构建一个均匀的矩阵,

    剩下就是如何构造了

    这是其中一种构造方法

     

    1. #include<iostream>
    2. #include<vector>
    3. #include<queue>
    4. #include<algorithm>
    5. #include<cmath>
    6. #include<cstring>
    7. using namespace std;
    8. int a[305][305];
    9. void solve()
    10. {
    11. int n,k;
    12. cin >> n >> k;
    13. memset(a,0,sizeof a);
    14. int t = 1;
    15. while(k)
    16. {
    17. for(int i = t;i <= n;i++)
    18. {
    19. if(a[i][i-t+1]==0&&k)
    20. {
    21. a[i][i-t+1] =1;
    22. k--;
    23. }
    24. }
    25. for(int j = 1;j < t;j++)
    26. {
    27. if(a[j][n-t+j+1]==0&&k)
    28. {
    29. a[j][n-t+j+1] = 1;
    30. k--;
    31. }
    32. }
    33. t++;
    34. }
    35. int ans = 0,l1 = n+1,l2 = n+1,r1 = 0,r2 =0;
    36. for(int i = 1;i <= n;i++)
    37. {
    38. int s1 = 0,s2 = 0;
    39. for(int j = 1;j <= n;j++)
    40. {
    41. s1 += a[i][j];
    42. s2 += a[j][i];
    43. }
    44. l1 = min(s1,l1);
    45. r1 = max(s1,r1);
    46. l2 = min(s2,l2);
    47. r2 = max(s2,r2);
    48. }
    49. ans = (r1 - l1)*(r1 - l1)+(r2 - l2)*(r2 - l2);
    50. cout<<ans<<"\n";
    51. for(int i = 1;i <= n;i++)
    52. {
    53. for(int j = 1;j <= n;j++)
    54. cout<<a[i][j];
    55. cout<<"\n";
    56. }
    57. }
    58. int main()
    59. {
    60. int t;
    61. cin >> t;
    62. while(t--)
    63. {
    64. solve();
    65. }
    66. }

     

  • 相关阅读:
    消息队列一|从秒杀活动开始聊起消息队列
    postgresql autovaccum自动清理
    基于STM32结合CubeMX学习Free-RT-OS的源码之任务调度
    芯天下在创业板过会:预计全年收入将达到10亿元,净利润约2亿元
    算法系列-链表
    单词方阵-(棋盘问题)
    [b01lers2020]Welcome to Earth-1
    2022安洵杯web题复现
    使用中台 Admin.Core 实现了一个Razor模板的通用代码生成器
    Python算法——树的路径和算法
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127677914