#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"); } } } |
English