• 2022 - 8 洛谷


     [NOIP2007 普及组] 奖学金

    这道题虽然我想到了和结构体,但没见过比较那么多的,一时间绷住了qwq(基础果然还要多练练)

    1. #include
    2. using namespace std;
    3. int n;
    4. struct stu{
    5. int cn, en, ma;
    6. int num;
    7. int sum;
    8. }st[310];
    9. bool cmp(stu a, stu b){
    10. if(a.sum > b.sum) return 1;
    11. else if(a.sum == b.sum && a.cn > b.cn) return 1;
    12. else if(a.sum == b.sum && a.cn == b.cn && a.num < b.num) return 1;
    13. else return 0;
    14. }
    15. int main(){
    16. cin >> n;
    17. for(int i = 1; i <= n; i ++ ){
    18. cin >> st[i].cn >> st[i].ma >> st[i].en;
    19. st[i].num = i;
    20. st[i].sum = st[i].cn + st[i].ma + st[i].en;
    21. }
    22. sort(st + 1, st + 1 + n, cmp);
    23. for(int i = 1; i <= 5; i ++ ){
    24. cout << st[i].num << " " << st[i].sum << endl;
    25. }
    26. return 0;
    27. }

    P1012 [NOIP1998 提高组] 拼数 

    1. #include
    2. using namespace std;
    3. int n;
    4. string s[25];
    5. bool cmp(const string &a, const string &b){
    6. return a + b > b + a;
    7. }
    8. int main(){
    9. cin >> n;
    10. for(int i = 0; i < n; i ++ ) cin >> s[i];
    11. sort(s, s + n, cmp);
    12. for(int i = 0; i < n; i ++ ) cout << s[i];
    13. return 0;
    14. }

    P1923 【深基9.例4】求第 k 小的数 

     woc这道题掉坑里了,题目求的是第k小的数不是排好序后第k个数

    按样例来分析,已知最小的数是第0小,如果求的是第1小的数, 【1 2 3 4 5】数列中第1小的数应该是2,第k个数应该是1, 所以在输入k后要自加1

    1. #include
    2. using namespace std;
    3. const int N = 5e6 + 10;
    4. int a[N];
    5. int n, k;
    6. int quick_select(int a[], int l, int r, int k){
    7. if(l >= r) return a[l];
    8. int i = l - 1, j = r + 1, x = a[l + r >> 1];
    9. while(i < j){
    10. do i ++ ; while(a[i] < x);
    11. do j -- ; while(a[j] > x);
    12. if(i < j) swap(a[i], a[j]);
    13. }
    14. if(k <= j - l + 1) quick_select(a, l, j, k);
    15. else quick_select(a, j + 1, r, k - (j - l + 1));
    16. }
    17. int main(){
    18. ios::sync_with_stdio(false);
    19. cin.tie(0), cout.tie(0);
    20. cin >> n >> k;
    21. k ++ ;
    22. for(int i = 0; i < n; i ++ ) cin >> a[i];
    23. cout << quick_select(a, 0, n - 1, k)<< endl;
    24. return 0;
    25. }

    P1068 [NOIP2009 普及组] 分数线划定

    1. #include
    2. using namespace std;
    3. const int N = 5010;
    4. int n, m;
    5. struct stu{
    6. int num, score;
    7. }st[N];
    8. bool cmp(stu a, stu b){
    9. if(a.score > b.score) return true;
    10. else if(a.score == b.score && a.num < b.num) return true;
    11. else return false;
    12. }
    13. int main(){
    14. cin >> n >> m;
    15. for(int i = 1; i <= n; i ++ ) cin >> st[i].num >> st[i].score;
    16. sort(st + 1, st + 1 + n, cmp);
    17. m = m * 1.5;
    18. int level = st[m].score;
    19. int cnt = m;
    20. for(int i = m + 1; i <= n && st[i].score == level; i ++ ){
    21. cnt ++ ;
    22. }
    23. cout << level << " " << cnt << endl;
    24. for(int i = 1; i <= cnt; i ++ ){
    25. cout << st[i].num << " " << st[i].score << endl;
    26. }
    27. return 0;
    28. }

    P1781 宇宙总统 

    这题a.sum.size() 的做法好骚啊 难绷

    1. #include
    2. using namespace std;
    3. int n;
    4. struct stu{
    5. int num;
    6. string sum;
    7. }s[25];
    8. bool cmp(stu a, stu b){
    9. if(a.sum.size() > b.sum.size()) return true;
    10. else if(a.sum.size() == b.sum.size() && a.sum > b.sum) return true;
    11. else return false;
    12. }
    13. int main(){
    14. cin >> n;
    15. for(int i = 1; i <= n; i ++ ){
    16. cin >> s[i].sum;
    17. s[i].num = i;
    18. }
    19. sort(s + 1, s + 1 + n, cmp);
    20. cout << s[1].num << endl;
    21. cout << s[1].sum << endl;
    22. return 0;
    23. }

     


     P1909 [NOIP2016 普及组] 买铅笔

    倍增 

    get新知识点wwwwwww

    1. #include
    2. using namespace std;
    3. int n, ans;
    4. int main(){
    5. cin >> n;
    6. for(int i = 0; i < 3; i ++ ){
    7. int cnt, price;
    8. cin >> cnt >> price;
    9. int c = cnt, p = price;
    10. while(cnt < n){
    11. cnt <<= 1;
    12. price <<= 1;
    13. }
    14. while(cnt > n){
    15. cnt -= c;
    16. price -= p;
    17. }
    18. while(cnt < n){
    19. cnt += c;
    20. price += p;
    21. }
    22. if(price < ans || ans == 0) ans = price;
    23. }
    24. cout << ans << endl;
    25. return 0;
    26. }

    P1427 小鱼的数字游戏 

     这道题死在了stack加数据原来是push 不是push_back   orz

    stack的使用

    empty() 堆栈为空则返回真

    pop() 移除栈顶元素 (删除)

    push() 在栈顶增加元素 (增加)

    size() 返回栈中元素数目

    top() 返回栈顶元素,不删除(获取)

    1. #include
    2. using namespace std;
    3. stack<int> a;
    4. int main(){
    5. int x;
    6. while(cin >> x){
    7. if(x == 0) break;
    8. a.push(x);
    9. }
    10. while(!a.empty()){
    11. cout << a.top() << " ";
    12. a.pop();
    13. }
    14. return 0;
    15. }

    P1055 [NOIP2008 普及组] ISBN 号码 

    错因分析: 

    这道题用一开始用字符串有一个wa了,因为字符串和数组的 .size()的数值不一样,和strlen()长度弄混了就寄了 

    这张网图可以很清楚的表现出二者的区别,wwwww我的破基础orz

    字符串做法: 

    1. #include
    2. using namespace std;
    3. string s;
    4. int sum;
    5. char c;
    6. int main(){
    7. getline(cin, s);
    8. for(int i = 0, j = 1; i < s.size() - 2; i ++ ){
    9. if(isdigit(s[i])){
    10. sum += (s[i] - '0') * j;
    11. j ++ ;
    12. }
    13. }
    14. sum %= 11;
    15. int t = s[12];
    16. s[12] = sum == 10 ? 'X' : sum + '0';
    17. if(t == s[12]){
    18. cout << "Right";
    19. }
    20. else{
    21. for(int i = 0; i < s.size(); i ++ ) cout << s[i];
    22. }
    23. return 0;
    24. }

    数组做法:

    1. #include
    2. #define INF 0x3f3f3f3f
    3. using namespace std;
    4. char s[13];
    5. int sum;
    6. char c;
    7. int main(){
    8. for(int i = 0, j = 1; i < 13; i ++ ){
    9. cin >> s[i];
    10. if(isdigit(s[i]) && i != 12){
    11. sum += (s[i] - '0') * j;
    12. j ++ ;
    13. }
    14. }
    15. sum %= 11;
    16. int t = s[12];
    17. s[12] = sum == 10 ? 'X' : sum + '0';
    18. if(t == s[12]){
    19. cout << "Right";
    20. }
    21. else{
    22. for(int i = 0; i < 13; i ++ ) cout << s[i];
    23. }
    24. return 0;
    25. }

    P5594 【XR-4】模拟赛 

    1. #include
    2. #define INF 0x3f3f3f3f
    3. using namespace std;
    4. const int N = 1e3 + 10;
    5. int a[N][N]; //标记的数组
    6. int n, m, k, x;
    7. int main(){
    8. cin >> n >> m >> k;
    9. for(int i = 1; i <= n; i ++ ){
    10. for(int j = 1; j <= m; j ++ ){
    11. cin >> x;
    12. a[x][j] = 1;//输入第i个人在第x天打了第j次卡,并做标记
    13. }
    14. }
    15. for(int i = 1; i <= k; i ++ ){//一共k次输出
    16. for(int j = 1; j <= m; j ++ ){//从1~最大打卡天数进行枚举,看第i场有多少人打卡
    17. a[i][j] += a[i][j - 1];
    18. }
    19. cout << a[i][m] << " "; //输出部分和的总量,即第1~k天分别对应的模拟赛场次
    20. }
    21. return 0;
    22. }

    P5707 【深基2.例12】上学迟到 

     一开始wa的亚UN隐式1两个整数相除有可能有小数点,需要用浮点型,所以干脆整型设为double(?应该是这个原因吧因为改了就ac了)

    1. #include
    2. #define INF 0x3f3f3f3f
    3. #define PI 3.14159
    4. using namespace std;
    5. typedef long long LL;
    6. double s, v;
    7. int main(){
    8. cin >> s >> v;
    9. int tm = ceil(s / v) + 10;
    10. int n = (8 + 24) * 60;
    11. n -= tm;
    12. if(n >= 24 * 60) n -= 24 * 60;
    13. int hh = n / 60;
    14. int mm = n % 60;
    15. printf("%02d:%02d", hh, mm);
    16. return 0;
    17. }

    P1765 手机 

    为什么打表放在主函数外会re啊?QVQ

    1. #include
    2. #define INF 0x3f3f3f3f
    3. using namespace std;
    4. typedef long long LL;
    5. string s;
    6. int cnt;
    7. int t[50] = {0};
    8. int main(){
    9. string key[12] = {
    10. "", "abc", "def",
    11. "ghi", "jkl", "mno",
    12. "pqrs", "tuv", "wxyz",
    13. "*", " ", "#"
    14. };
    15. for(int i = 0; i < 12; i ++ ){
    16. for(int j = 0; j < key[i].size(); j ++ ){
    17. t[key[i][j]] = j + 1;
    18. }
    19. }
    20. getline(cin, s);
    21. for(int i = 0; i < s.size(); i ++ ){
    22. cnt += t[s[i]];
    23. }
    24. cout << cnt << endl;
    25. return 0;
    26. }

    P1914 小书童——凯撒密码 

    难绷,这道题写快了没考虑到 s[i] == 'z' 的情况呜呜呜呜QAQ 

    1. #include
    2. #define INF 0x3f3f3f3f
    3. using namespace std;
    4. typedef long long LL;
    5. string s;
    6. int main(){
    7. int n;
    8. cin >> n >> s;
    9. for(int i = 0; i < s.size(); i ++ ){
    10. for(int j = 1; j <= n; j ++ ){
    11. s[i] ++ ;
    12. if(s[i] > 'z') s[i] = 'a';
    13. }
    14. }
    15. cout << s << endl;
    16. return 0;
    17. }

     P1003 [NOIP2011 提高组] 铺地毯 题解 

    一开始数组开太大了爆了呜呜呜 

     美美MLE

    1. #include
    2. #define INF 0x3f3f3f3f
    3. using namespace std;
    4. typedef long long LL;
    5. const int N = 1e5 + 10;
    6. int a[N], b[N], g[N], k[N];
    7. int ans;
    8. int main(){
    9. int n, x, y;
    10. cin >> n;
    11. for(int i = 1; i <= n; i ++ ) cin >> a[i] >> b[i] >> g[i] >> k[i];
    12. cin >> x >> y;
    13. for(int i = 1; i <= n; i ++ ){
    14. if(x >= a[i] && x <= a[i] + g[i] && y >= b[i] && y <= b[i] + k[i]){
    15. ans = i;
    16. }
    17. }
    18. cout << ans << endl;
    19. return 0;
    20. }

    P1067 [NOIP2009 普及组] 多项式输出 

    1. #include
    2. using namespace std;
    3. const int N = 110;
    4. int a[N];
    5. int main(){
    6. int n;
    7. cin >> n;
    8. for(int i = 1; i <= n + 1; i ++ ) cin >> a[i];
    9. if(n == 0){
    10. cout << a[1];
    11. return 0;
    12. }
    13. if(abs(a[1]) != 1) cout << a[1] << "x^" << n;
    14. else{
    15. if(a[1] == 1) cout << "x^" << n;
    16. else if(a[1] == -1) cout << "-x^" << n;
    17. }
    18. int num = 2;
    19. for(int i = n - 1; i >= 1; i -- ){
    20. if(i != 1){
    21. if(a[num] > 0){
    22. if(a[num] == 1) cout << "+x^" << i;
    23. else cout << "+" << a[num] << "x^" << i;
    24. }
    25. else if(a[num] < 0){
    26. if(a[num] == -1) cout << "-x^" << i;
    27. else cout << a[num] << "x^" << i;
    28. }
    29. }
    30. else{
    31. if(a[num] > 0){
    32. if(a[num] == 1) cout << "+x";
    33. else cout << "+" << a[num] << "x";
    34. }
    35. else if(a[num] < 0){
    36. if(a[num] == -1) cout << "-x";
    37. else cout << a[num] << "x";
    38. }
    39. }
    40. num ++ ;
    41. }
    42. if(a[num] > 0) cout << "+" << a[num];
    43. else if(a[num] < 0) cout << a[num];
    44. return 0;
    45. }

    P5019 [NOIP2018 提高组] 铺设道路

    1. #include
    2. #define INF 0x3f3f3f3f
    3. using namespace std;
    4. typedef long long LL;
    5. const int N = 1e5 + 10;
    6. int f[N], a[N];
    7. int main(){
    8. int n;
    9. cin >> n;
    10. for(int i = 1; i <= n; i ++ ){
    11. cin >> a[i];
    12. f[1] = a[1];
    13. if(i != 1){
    14. if(a[i] <= a[i - 1]) f[i] = f[i - 1];
    15. else f[i] = f[i - 1] + a[i] - a[i - 1];
    16. }
    17. }
    18. cout << f[n] << endl;
    19. return 0;
    20. }

  • 相关阅读:
    年薪30W+的IC验证工程师究竟是做什么的?一文为你讲解清楚
    DataBinding 进阶用法
    【C++模板】类模板的全部特例化和局部特例化(偏特化-partial specialization)
    vue基本概念
    OpenGL 曝光度调节
    Thread的常用方法
    21.PWM应用编程
    Java之LinkedList()
    UE5 里的一些常用的了解
    独立站外链的数量和质量哪个更重要?
  • 原文地址:https://blog.csdn.net/weixin_63914060/article/details/126370669