#include<stdio.h> #include<algorithm> int t,n,i,liczba,iloczyn_przed,iloczyn_d,mianownik_d,obj_przed,i_przed,i_po,iloczyn_po,obj_po; bool mozliwe; struct szklanka { int v; int temp; }; szklanka przed[101010]; szklanka po[101010]; bool porownanie(szklanka a,szklanka b) { return (a.temp>=b.temp); } int main () { scanf("%i",&t); for (int indeks=0;indeks<t;indeks++) { mozliwe=true; scanf("%i",&n); for (i=0;i<n;i++) { scanf("%i %i %i",&liczba,&przed[i].temp,&po[i].temp); przed[i].v=liczba; po[i].v=liczba; } std::sort(przed,przed+n,porownanie); std::sort(po,po+n,porownanie); iloczyn_przed=przed[0].v*przed[0].temp; obj_przed=przed[0].v; iloczyn_po=po[0].v*po[0].temp; obj_po=po[0].v; i_przed=1; i_po=1; while (i_przed<n && i_po<n) { //printf("iloczyn_przed=%i obj_przed=%i iloczyn_po=%i obj_po=%i\n",iloczyn_przed,obj_przed,iloczyn_po,obj_po); if (iloczyn_przed*obj_po<obj_przed*iloczyn_po) { mozliwe=false; //printf("za niska temperatura\n"); //printf("iloczyn_przed=%i obj_przed=%i iloczyn_po=%i obj_po=%i\n",iloczyn_przed,obj_przed,iloczyn_po,obj_po); break; } iloczyn_d=iloczyn_przed+przed[i_przed].v*przed[i_przed].temp-iloczyn_po; mianownik_d=przed[i_przed].v+obj_przed-obj_po; //printf("iloczyn_d=%i mianownik_d=%i\n",iloczyn_d,mianownik_d); if (iloczyn_po>przed[i_przed].temp*obj_po && iloczyn_d*obj_przed<=mianownik_d*iloczyn_przed && przed[i_przed].v*mianownik_d<=iloczyn_d ) { iloczyn_po+=po[i_po].v*po[i_po].temp; obj_po+=po[i_po].v; i_po++; //printf("i_po++\n"); } else { iloczyn_przed+=przed[i_przed].v*przed[i_przed].temp; obj_przed+=przed[i_przed].v; i_przed++; //printf("i_przed++\n"); } } if (iloczyn_przed*obj_po<obj_przed*iloczyn_po) { mozliwe=false; } while (i_po<n) { if (iloczyn_przed==po[i_po].temp*obj_przed) { iloczyn_przed-=(po[i_po].temp*po[i_po].v); obj_przed-=po[i_po].v; } else { mozliwe=false; break; } i_po++; } iloczyn_przed=0; iloczyn_po=0; for (i=0;i<n;i++) { iloczyn_przed+=przed[i].v*przed[i].temp; iloczyn_po+=po[i].v*po[i].temp; } if (iloczyn_po!=iloczyn_przed) { mozliwe=false; } if(mozliwe==true) { printf("TAK\n"); } else { printf("NIE\n"); } } }
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 | #include<stdio.h> #include<algorithm> int t,n,i,liczba,iloczyn_przed,iloczyn_d,mianownik_d,obj_przed,i_przed,i_po,iloczyn_po,obj_po; bool mozliwe; struct szklanka { int v; int temp; }; szklanka przed[101010]; szklanka po[101010]; bool porownanie(szklanka a,szklanka b) { return (a.temp>=b.temp); } int main () { scanf("%i",&t); for (int indeks=0;indeks<t;indeks++) { mozliwe=true; scanf("%i",&n); for (i=0;i<n;i++) { scanf("%i %i %i",&liczba,&przed[i].temp,&po[i].temp); przed[i].v=liczba; po[i].v=liczba; } std::sort(przed,przed+n,porownanie); std::sort(po,po+n,porownanie); iloczyn_przed=przed[0].v*przed[0].temp; obj_przed=przed[0].v; iloczyn_po=po[0].v*po[0].temp; obj_po=po[0].v; i_przed=1; i_po=1; while (i_przed<n && i_po<n) { //printf("iloczyn_przed=%i obj_przed=%i iloczyn_po=%i obj_po=%i\n",iloczyn_przed,obj_przed,iloczyn_po,obj_po); if (iloczyn_przed*obj_po<obj_przed*iloczyn_po) { mozliwe=false; //printf("za niska temperatura\n"); //printf("iloczyn_przed=%i obj_przed=%i iloczyn_po=%i obj_po=%i\n",iloczyn_przed,obj_przed,iloczyn_po,obj_po); break; } iloczyn_d=iloczyn_przed+przed[i_przed].v*przed[i_przed].temp-iloczyn_po; mianownik_d=przed[i_przed].v+obj_przed-obj_po; //printf("iloczyn_d=%i mianownik_d=%i\n",iloczyn_d,mianownik_d); if (iloczyn_po>przed[i_przed].temp*obj_po && iloczyn_d*obj_przed<=mianownik_d*iloczyn_przed && przed[i_przed].v*mianownik_d<=iloczyn_d ) { iloczyn_po+=po[i_po].v*po[i_po].temp; obj_po+=po[i_po].v; i_po++; //printf("i_po++\n"); } else { iloczyn_przed+=przed[i_przed].v*przed[i_przed].temp; obj_przed+=przed[i_przed].v; i_przed++; //printf("i_przed++\n"); } } if (iloczyn_przed*obj_po<obj_przed*iloczyn_po) { mozliwe=false; } while (i_po<n) { if (iloczyn_przed==po[i_po].temp*obj_przed) { iloczyn_przed-=(po[i_po].temp*po[i_po].v); obj_przed-=po[i_po].v; } else { mozliwe=false; break; } i_po++; } iloczyn_przed=0; iloczyn_po=0; for (i=0;i<n;i++) { iloczyn_przed+=przed[i].v*przed[i].temp; iloczyn_po+=po[i].v*po[i].temp; } if (iloczyn_po!=iloczyn_przed) { mozliwe=false; } if(mozliwe==true) { printf("TAK\n"); } else { printf("NIE\n"); } } } |