zoukankan      html  css  js  c++  java
  • Prime Matrix

      【B.Prime Matrix】

      http://www.codeforces.com/contest/271/problem/B

      题目大意:n×m的格子,每次操作可以将一个格子中的数字加1,问最少操作次数使得存在一行或一列全为质数。

      预处理出每个格子需要多少次操作成为质数,然后求最小行、列和即可。素数筛表即可,注意多筛一些。

      一开始没打素数表,直接+1 +1的判断,导致超时...然后就有了上一篇文章...

    
    
     1 #include <iostream>
     2 #include <cmath>
     3 #define min(a,b) (((a)<(b))? (a):(b))
     4 
     5 const  int MAXN=101000;
     6 bool flag[MAXN];
     7 int prime[MAXN/3],pi,num[501][501];
     8 using namespace std;
     9 bool isPrime(int x)
    10 {//不打素数表的时候用来判断一个数是否为素数
    11     if(x==1)
    12         return false;
    13     if (x==2)
    14         return true;
    15     for (int i=2;i<=(int)sqrt((long double)x);i++)
    16     {
    17         if (x%i==0)
    18             return false;
    19     }
    20     return true;
    21 }
    22 void GetPrime_Improved()
    23 {    //打素数表.任何一个数与其它所有素数的乘积必然也不是素数(这是因为每个合数必有一个最小素因子)。
    24     //初始置为false,素数为false,非素数为true
    25     int i,j;
    26     pi=0;
    27     memset(flag,false,sizeof(flag));
    28     flag[1]=true;
    29     for (i=2;i<MAXN;i++)
    30     {
    31         if (!flag[i])
    32             prime[pi++]=i;
    33         for ( j = 0 ; ( j<pi )&&( i * prime[j]<MAXN ) ; j++)
    34         {
    35             flag[i*prime[j]]=true;
    36             if ( i % prime[j] == 0) //保证每个非素数只被筛一次
    37                 break;
    38         }
    39     }
    40 }
    41 int main()
    42 {
    43     int i,j,k,n,m,temp,rowCount,columnCount,countMin=0x7FFFFFFF;
    44     cin>>n>>m;
    45     GetPrime_Improved();    
    46     for (i=0;i<n;i++)
    47         for (j=0;j<m;j++)
    48         {
    49             cin>>temp;
    50             k=0;
    51             while (flag[temp+k])
    52                 k++;
    53             num[i][j]=k;    
    54         }
    55     for (i=0;i<n;i++)
    56         {
    57             rowCount=0;
    58             for (j=0;j<m;j++)
    59                 rowCount+=num[i][j];
    60             countMin=min(rowCount,countMin);
    61         }
    62     for (j=0;j<m;j++)
    63         {
    64             columnCount=0;
    65             for (i=0;i<n;i++)
    66                 columnCount+=num[i][j];
    67             countMin=min(columnCount,countMin);
    68         }
    69         cout<<countMin<<endl;
    70     return 0;
    71 }
  • 相关阅读:
    oracle学习笔记(十五) PL/SQL语法结构以及使用
    Jquery1
    DOM2
    DOM
    JS的使用
    登录
    数据库操作是sql的操作1
    数据库2_sqlHelper
    数据库1数据库常用指令
    C# 基础
  • 原文地址:https://www.cnblogs.com/aboutblank/p/2915075.html
Copyright © 2011-2022 走看看