二维前缀矩阵 [复制链接]
发表于 2025-10-12 16:10:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1.大衣的观光
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int t;
  5. int n,m,k;
  6. bool check(int mid,vector<vector<int>>pre,vector<vector<int>>a)
  7. {
  8.         for(int i=1; i<=n; i++)
  9.         {
  10.                 for(int j=1; j<=m; j++)
  11.                 {
  12.                         //枚举以老师房间为中心 距离mid的矩形区域边界
  13.                         int up=max(i-mid,(int)1),down=max(i+mid,n);
  14.                         int left=max(j-mid,(int)1),right=max(j+mid,m);
  15.                         int sum1=pre[down][right]-pre[down][left-1]-pre[up-1][right]+pre[up-1][left-1];
  16.                         //如果区域房间容量大于k+1 并且老师房间至少有一个容量 证明还能收缩
  17.                         if (sum1 >= k + 1 && a[i][j]) return true;
  18.                 }
  19.         }
  20.         return false;
  21. }
  22. signed main()
  23. {
  24.         cin>>t;
  25.         while(t--)
  26.         {
  27.                 cin>>n>>m>>k;
  28.                 vector<vector<int>>a(m+1);
  29.                 vector<vector<int>>pre(m+1);
  30.                 int sum=0;
  31.                 for(int i=1; i<=n; i++)
  32.                 {
  33.                         for(int j=1; j<=m; j++)
  34.                         {
  35.                                 cin>>a[i][j];
  36.                                 sum+=a[i][j];
  37.                         }
  38.                 }
  39.                 if(sum<k+1)
  40.                 {
  41.                         cout<<-1<<endl;
  42.                         continue;
  43.                 }
  44.                 for(int i=1; i<=n; i++)
  45.                 {
  46.                         for(int j=1; j<=m; j++)
  47.                         {
  48.                                 pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j];
  49.                         }
  50.                 }
  51.                 int l=0,r=max(n,m),mid=0;
  52.                 int ans=-1;
  53.                 while(l<=r) //二分遍历所有情况,找到老师的房间和距离他最远的学生的房间距离最小
  54.                 {
  55.                         mid=(l+r)/2;
  56.                         if(check(mid,pre,a))
  57.                         {
  58.                                 r=mid-1; //存在符合继续缩减范围
  59.                                 ans=mid;
  60.                         }
  61.                         else
  62.                         {
  63.                                 l=mid+1;
  64.                         }
  65.                 }
  66.                 cout<<ans<<endl;
  67.         }
  68.         return 0;
  69. }
复制代码
2.小秋的矩阵
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n,m,k;
  5. int a[10010][10010],sum[10010][10010];
  6. signed main()
  7. {
  8.         cin>>n>>m>>k;
  9.         for(int i=1; i<=n; i++)
  10.         {
  11.                 for(int j=1; j<=m; j++)
  12.                 {
  13.                         cin>>a[i][j];
  14.                         if(a[i][j]==1) a[i][j]=0;
  15.                         else a[i][j]=1;
  16.                         sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+a[i][j];
  17.                 }
  18.         }
  19.         int sum1=0;
  20.         // 遍历所有可能的方阵,方阵大小为 l x l
  21.         for (int l = 1; l <= min(n, m); l++)
  22.         {
  23.                 // 遍历每个方阵的左上角位置 (i, j)
  24.                 for (int i = 1; i <= n - l + 1; i++)
  25.                 {
  26.                         for (int j = 1; j <= m - l + 1; j++)
  27.                         {
  28.                                 // 获取左上角为 (i, j) 的 l x l 方阵的和
  29.                                 int total = sum[i + l - 1][j + l - 1] - sum[i - 1][j + l - 1] - sum[i + l - 1][j - 1] + sum[i - 1][j - 1];
  30.                                 if(total==k)
  31.                                 {
  32.                                         sum1++;
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37.         cout<<sum1<<endl;
  38.         return 0;
  39. }
复制代码
二维矩阵前缀盘算时绘图明白 
3.错误票据
  1. #include<bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4. int n;
  5. vector<int>a;
  6. signed main()
  7. {
  8.         cin>>n;
  9.         getchar();
  10.         string line;
  11.         while(n--)
  12.         {
  13.                 getline(cin,line);
  14.                 stringstream ss(line);
  15.                 int num;
  16.                 while(ss>>num)
  17.                 {
  18.                         a.push_back(num);
  19.                 }
  20.         }
  21.         sort(a.begin(),a.end());
  22.         int m,n;
  23.         for(int i=0;i<a.size()-1;i++)
  24.         {
  25.                 if((a[i]+1)!=a[i+1] && a[i]!=a[i+1]) //断号且非重号情况
  26.                 {
  27.                         m=a[i]+1;
  28.                 }
  29.                 if(a[i]==a[i+1]) //重号
  30.                 {
  31.                         n=a[i];
  32.                 }
  33.         }
  34.         cout<<m<<" "<<n<<endl;
  35.         return 0;
  36. }
复制代码
对于空格字符串的处置惩罚 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表