Submission #568631

#TimeUsernameProblemLanguageResultExecution timeMemory
568631TomkeMonkePoi (IOI09_poi)C++17
100 / 100
296 ms16120 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2e3 + 7; vector<int> solved[MAXN]; int points[MAXN]; int score[MAXN]; /** * Method for comparing two contestants, for determining their * order in the rankings. Returns true if contestant with index * x should appear before y in the list (i.e. x ranks higher * than y). */ bool poiLess(int x, int y){ // If x has a higher score, then they did better. if (score[x] > score[y]) return true; else if (score[x] == score[y]){ // If they have the same score, then see who solved more // problems. if (solved[x].size() > solved[y].size()) return true; else if (solved[x].size() == solved[y].size()) // Same number of problems, so base the decision on // the contestants' IDs. return x < y; else return false; } else return false; } int main(){ int n, t, p; scanf("%d %d %d", &n, &t, &p); assert(1 <= n && n <= MAXN); assert(1 <= t && t <= MAXN); assert(1 <= p && p <= n); p--; memset(points, 0, sizeof(points)); // Now read in the information about which contestants solved // which problems. As we do this, we keep track for each problem // how many contestants did not solve it, and thus how many points // the problem will be worth. for (int i = 0; i < n; i++){ solved[i].reserve(n); int x; for (int j = 0; j < t; j++){ scanf("%d", &x); if (x == 1) // Solved, so make a note of this solved[i].push_back(j); else // Not solved, which means that the problem is worth // one extra point points[j]++; } } // We now work out the actual number of points that each // contestant receives, based on how many points the problem // ended up being worth. vector<int> sortedIds; sortedIds.reserve(n); for (int i = 0; i < n; i++){ score[i] = 0; for(int j = 0; j < solved[i].size(); j++) score[i] += points[solved[i][j]]; sortedIds.push_back(i); } // Now sort the contestants. sort(sortedIds.begin(), sortedIds.end(), poiLess); // Now find out which position Philip came in for(int i = 0; i < n; i++){ if(sortedIds[i] == p){ cout << score[p] << " " << (i + 1) << endl; return 0; } } // Should never get here assert(false); return 0; }

Compilation message (stderr)

poi.cpp: In function 'int main()':
poi.cpp:81:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |         for(int j = 0; j < solved[i].size(); j++)
      |                        ~~^~~~~~~~~~~~~~~~~~
poi.cpp:43:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |     scanf("%d %d %d", &n, &t, &p);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
poi.cpp:62:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |             scanf("%d", &x);
      |             ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...