#include <iostream> #include <queue> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; /*autor: Agnieszka Klich*/ long long int n, m, k; int mapa [4000000]; int ileDrog(){ queue<int> kolejka; kolejka.push(0); int ruch=0; int pole; do{ pole = kolejka.front(); // cout <<endl<<"Nowe pole: " << pole<<endl; kolejka.pop(); ruch = mapa[pole]+1; if(pole==n*m-1) return mapa[n*m-1]; // cout << "pole: " << pole << "ruch: " << ruch << endl; if(pole>m){//mozna isc do gory // cout << "gora "<<mapa[pole-m]<<"\n"; if(mapa[pole-m]==0){ // cout << "ribie ruch na pole: " << pole-m << "ruch: " << ruch << endl; mapa[pole-m]=ruch; kolejka.push(pole-m); } } if(pole<(n-1)*m){//mozna isc na dol // cout << "dol "<<mapa[pole+m] <<" \n"; if(mapa[pole+m]==0){ // cout << "ribie ruch na pole: " << pole+m << "ruch: " << ruch << endl; mapa[pole+m]=ruch; kolejka.push(pole+m); } } if(pole%m!=0 && pole!=1){ //mozna isc w lewo // cout << "lewo "<<mapa[pole-1]<<"\n"; if(mapa[pole-1]==0){ // cout << "ribie ruch na pole: " << pole-1 << "ruch: " << ruch << endl; mapa[pole-1]=ruch; kolejka.push(pole-1); } } if(pole%m!=m-1){ //mozna isc w prawo // cout << "prawo "<<mapa[pole+1]<<"\n"; if(mapa[pole+1]==0){ // cout << "ribie ruch na pole: " << pole+1 << "ruch: " << ruch << endl; mapa[pole+1]=ruch; kolejka.push(pole+1); } } } while(pole!=n*m-1); return 0; } int main(int argc, char** argv) { cin >> n >> m >> k; char znak; for (int i=0; i<n; ++i){ for(int j=0; j<m; ++j){ do{ cin>>znak; }while(znak!='.' && znak!='X'); if(znak=='X') mapa[i*m+j] = -1; else if(znak='.') mapa[i*m+j] = 0; // cout <<"Pole:"<<i*m+j<<" Mapa[i*m+j] = "<<mapa[i*n+j] <<endl; } } int ileRuchow = ileDrog(); // cout << "Ile ruchow: "<<ileRuchow<<endl; int ileTeoretycznieNajkrocej = n+m-2; int ileNaDol = (ileRuchow - ileTeoretycznieNajkrocej)/2; int ileDoGory = ileRuchow - ileNaDol; // cout << "Ile ruchow: "<<ileRuchow<<" ile na dol: "<<ileNaDol<<" ile do gory: "<<ileDoGory<<endl; long long int prGora, prDol, czas; long long int minCzas = 9000000000000000; long long int ileOsob = 0; for(long long int i=0; i<k; ++i){ cin >> prGora >> prDol; czas = prGora*ileDoGory+prDol*ileNaDol; // cout << "zawodnik: "<< i <<" czas:" << czas<<endl; if(czas<minCzas){ ileOsob = 0; minCzas = czas; } if(czas==minCzas){ ++ileOsob; } } cout << minCzas <<" "<< ileOsob << "\n"; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #include <iostream> #include <queue> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ using namespace std; /*autor: Agnieszka Klich*/ long long int n, m, k; int mapa [4000000]; int ileDrog(){ queue<int> kolejka; kolejka.push(0); int ruch=0; int pole; do{ pole = kolejka.front(); // cout <<endl<<"Nowe pole: " << pole<<endl; kolejka.pop(); ruch = mapa[pole]+1; if(pole==n*m-1) return mapa[n*m-1]; // cout << "pole: " << pole << "ruch: " << ruch << endl; if(pole>m){//mozna isc do gory // cout << "gora "<<mapa[pole-m]<<"\n"; if(mapa[pole-m]==0){ // cout << "ribie ruch na pole: " << pole-m << "ruch: " << ruch << endl; mapa[pole-m]=ruch; kolejka.push(pole-m); } } if(pole<(n-1)*m){//mozna isc na dol // cout << "dol "<<mapa[pole+m] <<" \n"; if(mapa[pole+m]==0){ // cout << "ribie ruch na pole: " << pole+m << "ruch: " << ruch << endl; mapa[pole+m]=ruch; kolejka.push(pole+m); } } if(pole%m!=0 && pole!=1){ //mozna isc w lewo // cout << "lewo "<<mapa[pole-1]<<"\n"; if(mapa[pole-1]==0){ // cout << "ribie ruch na pole: " << pole-1 << "ruch: " << ruch << endl; mapa[pole-1]=ruch; kolejka.push(pole-1); } } if(pole%m!=m-1){ //mozna isc w prawo // cout << "prawo "<<mapa[pole+1]<<"\n"; if(mapa[pole+1]==0){ // cout << "ribie ruch na pole: " << pole+1 << "ruch: " << ruch << endl; mapa[pole+1]=ruch; kolejka.push(pole+1); } } } while(pole!=n*m-1); return 0; } int main(int argc, char** argv) { cin >> n >> m >> k; char znak; for (int i=0; i<n; ++i){ for(int j=0; j<m; ++j){ do{ cin>>znak; }while(znak!='.' && znak!='X'); if(znak=='X') mapa[i*m+j] = -1; else if(znak='.') mapa[i*m+j] = 0; // cout <<"Pole:"<<i*m+j<<" Mapa[i*m+j] = "<<mapa[i*n+j] <<endl; } } int ileRuchow = ileDrog(); // cout << "Ile ruchow: "<<ileRuchow<<endl; int ileTeoretycznieNajkrocej = n+m-2; int ileNaDol = (ileRuchow - ileTeoretycznieNajkrocej)/2; int ileDoGory = ileRuchow - ileNaDol; // cout << "Ile ruchow: "<<ileRuchow<<" ile na dol: "<<ileNaDol<<" ile do gory: "<<ileDoGory<<endl; long long int prGora, prDol, czas; long long int minCzas = 9000000000000000; long long int ileOsob = 0; for(long long int i=0; i<k; ++i){ cin >> prGora >> prDol; czas = prGora*ileDoGory+prDol*ileNaDol; // cout << "zawodnik: "<< i <<" czas:" << czas<<endl; if(czas<minCzas){ ileOsob = 0; minCzas = czas; } if(czas==minCzas){ ++ileOsob; } } cout << minCzas <<" "<< ileOsob << "\n"; return 0; } |