Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// solutie - Moca Andrei
- #include <bits/stdc++.h>
- using namespace std;
- class InParser {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch() {
- ++sp;
- if (sp == 4096) {
- sp = 0;
- fread(buff, 1, 4096, fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume) {
- fin = fopen(nume, "r");
- buff = new char[4096]();
- sp = 4095;
- }
- InParser& operator >> (int &n) {
- char c;
- while (!isdigit(c = read_ch()) && c != '-');
- int sgn = 1;
- if (c == '-') {
- n = 0;
- sgn = -1;
- } else {
- n = c - '0';
- }
- while (isdigit(c = read_ch())) {
- n = 10 * n + c - '0';
- }
- n *= sgn;
- return *this;
- }
- };
- class OutParser {
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch) {
- if (sp == 50000) {
- fwrite(buff, 1, 50000, fout);
- sp = 0;
- buff[sp++] = ch;
- } else {
- buff[sp++] = ch;
- }
- }
- public:
- OutParser(const char* name) {
- fout = fopen(name, "w");
- buff = new char[50000]();
- sp = 0;
- }
- ~OutParser() {
- fwrite(buff, 1, sp, fout);
- fclose(fout);
- }
- OutParser& operator << (int vu32) {
- if (vu32 <= 9) {
- write_ch(vu32 + '0');
- } else {
- (*this) << (vu32 / 10);
- write_ch(vu32 % 10 + '0');
- }
- return *this;
- }
- OutParser& operator << (char ch) {
- write_ch(ch);
- return *this;
- }
- OutParser& operator << (const char *ch) {
- while (*ch) {
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- InParser fin("sort4.in");
- OutParser fout("sort4.out");
- struct elem {
- int nr, sum, prod, val;
- bool operator < (const elem& e) const
- {
- if (nr != e.nr) return nr > e.nr;
- if (sum != e.sum) return sum < e.sum;
- if (prod != e.prod) return prod < e.prod;
- return val < e.val;
- }
- };
- int nrcif, scif, pcif, freq, aux;
- inline void prelucrare(int x)
- {
- freq = scif = 0;
- pcif = 1;
- while (x)
- {
- freq |= (1 << (x % 10));
- scif += (x % 10);
- pcif *= (x % 10);
- x /= 10;
- }
- nrcif = __builtin_popcount(freq);
- }
- vector<elem> v;
- int n, x;
- int main()
- {
- fin >> n;
- v = vector<elem>(n);
- for (int i = 0; i < n; ++i)
- {
- fin >> x;
- prelucrare(x);
- v[i] = {nrcif, scif, pcif, x};
- }
- sort(v.begin(), v.end());
- for (const elem& e : v)
- fout << e.val << ' ';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement