Graf_Rav

My27

May 21st, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7.     int n, m;
  8.     cin>>n>>m;
  9.    
  10.     vector<int> sym(13, 0);
  11.    
  12.     vector<int> nym(m);
  13.     for(int i=0;i<n;i++){   //O(n)
  14.         for(int j=0;j<m;j++){
  15.             cin>>nym[j];
  16.         }
  17.        
  18.         vector<int> buffer(13, 0x7FFFFFFF); //buffer[j] хранит в себе минимум суммы произведений
  19.                                             //пар чисел с i+1-й строчки
  20.         for(int j=0;j<m-1;j++){
  21.             for(int k=j+1;k<m;k++){     //перебор всех возможных пар в m числах O(m^2)
  22.                 for(int l=0;l<13;l++){  //К каждой сумме прибавляем произведение данной конкретной пары
  23.                     if(sym[l]==0 && i>0){//если, конечно, sym[l] существует для i-й строки
  24.                         continue;
  25.                     }
  26.                     //Произведение данной конкретной пары равно nym[j]*nym[k]
  27.                     //sym[l]+nym[j]*nym[k] - сумма, которая может получиться, если прибавить
  28.                     //к sym[l] произведение данной пары. Если оно меньше суммы с тем же остатком
  29.                     //то запишем новую сумму вместо старой или 0x7FFFFFFF
  30.                     buffer[(sym[l]+nym[j]*nym[k])%13]=min(buffer[(sym[l]+nym[j]*nym[k])%13], sym[l]+nym[j]*nym[k]);
  31.                 }
  32.             }
  33.         }
  34.        
  35.         for(int j=0;j<13;j++){
  36.             if(buffer[j]==0x7FFFFFFF){  //Если за эту строку не сформировалось суммы
  37.                 sym[j]=0;               //с остатком j, то sym[j]=0
  38.             }
  39.             else{                       //Иначе сохраняем найденную сумму
  40.                 sym[j]=buffer[j];
  41.             }
  42.         }
  43.     }
  44.    
  45.     int mini=0x7FFFFFFF;
  46.     for(int i=1;i<13;i++){//Начинаем с единицы, т.к. сумма не должна быть кратна 13
  47.         if(sym[i]!=0 && sym[i]<mini){
  48.             mini=sym[i];
  49.         }
  50.     }
  51.    
  52.     if(mini==0x7FFFFFFF){
  53.         cout<<0;
  54.     }
  55.     else{
  56.         cout<<mini;
  57.     }
  58. }
  59. /*
  60. Input:
  61. 2 3
  62. 7 6 2
  63. 2 7 23
  64. Ouput:
  65. 28
  66. */
Add Comment
Please, Sign In to add comment