acm模式练习

1.A + B问题

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int a, b;
    while (cin >> a >> b) cout << a + b << endl;
}

while循环什么时候停止?

2.A + B问题||

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int n, a, b;
    while (cin >> n) {
        while(n--){
            cin >> a >> b;
            cout << a + b << endl;
        }
    }
}

外层while循环什么时候停止?

3.A + B|||

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int a, b;
    while(cin >> a >> b){
        if(a == 0 && b == 0) break;
        cout << a + b << endl;
    }
}

学会break的使用时机

4.A + B|V

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int n, a;
    while(cin >> n){
        if(n == 0) break;
        int sum = 0;
        while(n--){
            cin >> a;
            sum += a;
        }
        cout << sum << endl;
    }
}

5.A + B问题V||

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int n, a;
    while(cin >> n){
        if(n == 0) break;
        int sum = 0;
        while(n--){
            cin >> a;
            sum += a;
        }
        cout << sum << endl;
    }
}

多一个endl就可以额外输出一个空行

6.A+ B问题V|||

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int n, m, a;
    while(cin >> n){
        while(n--){
            cin >> m;
            int sum = 0;
            while(m--){
                cin >> a;
                sum += a;
            }
            cout << sum << endl;
            if(n != 0) cout << endl;
        }
    }
}

需要多输出换行符,且右多组计算数据,但每大组之间又不需要换行符

7.平均绩点(浮点数格式)

cpp 复制代码
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
    string s;
    while (getline(cin, s)){    //接受一整行字符串
        float sum = 0;
        int count = 0;
        int flag = 1;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == 'A') {sum += 4; count++;}
            else if(s[i] == 'B') {sum += 3; count++;}
            else if(s[i] == 'C') {sum += 2; count++;}
            else if(s[i] == 'D') {sum += 1; count++;}
            else if(s[i] == 'F') {sum += 0; count++;}
            else if(s[i] == ' ') continue;
            else{
                flag = 0;
                cout << "Unknown" << endl;
                break;
            }
        }
        if(flag == 1) printf("%.2f\n", sum / count);
    }
    return 0;
}

1.getline函数格式,直到读入一个换行符时停止,可接受一整行的换行符

2.s字符串可以直接进行下标访问

3." "引用字符串。''引用char类型的字符

4.cout和printf的区别:前者自动输出换行符,后者要自己输出"\n"

5.对输出小数格式的控制

8.摆平积木

思路还是挺好想的,大差不差

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int main() {
    int n;
    while(cin >> n){
        if(n == 0) break;       //这里必须要有break,不然就会错
        vector<int> nums(n, 0);
        int sum = 0;
        for(int i = 0; i < n; i++){
            cin >> nums[i];
            sum += nums[i];
        }
        int average = sum / n;
        int move = 0;
        for(int i = 0; i < n; i++){
            if(nums[i] > average) move += nums[i] - average;
        }
        cout << move << endl;
        cout << endl;
    }
}

那个break出去是啥意思?因为题目说了:当n=0时,输入结束。

为什么这个while循环是必要的?不能直接cin>>n吗?但好像确实所有题在输入时都用了while循环。

9.奇怪的信

就是取出每一位数并进行判断,比较简单,还是注意上面那道题说的cin时要有while循环

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int n;
    while(cin >> n){
        int sum = 0;
        while(n){
            int num = n % 10;
            if(num % 2 == 0) sum += num;
            n = n / 10;
        }
        cout << sum << endl << endl;
    }
}

10.运营商活动

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int m, k;
    while(cin >> m >> k){
        if(m == 0 && k == 0) break;    //设置终止条件
        int count = 0;
        int day = m;
        while(m >= k){
            day += m / k;       //这个while循环里要仔细理解题意
            m = m / k + m % k;     
        }
        cout << day << endl;
    }
}

11.公共祖先

用数组建立映射的方法值得学习

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int main () {
    int n;
    vector<int> nums(21,0);
    while(cin >> n){
        while(n--){
            int a, b;
            cin >> a >> b;
            nums[a] = b;        //a的祖先是b,建立由a到b的映射关系
        }   
        int len_ming = 0, len_yu = 0;    //分别表示小明小于是第几辈
        int ming = nums[1], yu = nums[2];            //小明编号为1,小宇编号为2
        for(; ming != 0; len_ming++){
            ming = nums[ming];
        }
        for(; yu != 0; len_yu++){
            yu = nums[yu];
        }
        // while(ming != 0){
        //     ming = nums[ming];
        //     len_ming++;
        // }
        // while(yu != 0){
        //     yu = nums[yu];
        //     len_yu++;
        // }
        if(len_ming < len_yu) cout << "You are my younger" << endl;
        else if(len_yu < len_ming) cout << "You are my elder" << endl;
        else cout << "You are my brother" << endl;
    }
}

对长辈和晚辈的理解(捂脸)

13.句子缩写(字符串)

怎么处理空格?getline(cin, s)可读入一行字符串,读到换行符时终止

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
char changeChar(char &a) {    //大写变小写
    if (a >= 'a' && a <= 'z') a -= 32;
    return a;
}
int main () {
    int n;
    string result, s;     //s用来记录当前行字符、result用来记录最终缩写的结果
    cin >> n;
    getchar();   
    while (n--) {
        result = "";          //读入新的一行后,将结果刷新
        getline(cin, s);      //先获取整行字符串
        result += changeChar(s[0]);     //获取第一个字母
        for (int i = 1; i < s.size() - 1; i++){
            if(s[i] == ' ' && s[i + 1] != ' ') result += changeChar(s[i + 1]);
        }
        cout << result << endl;
    }
}

学习吞掉词组之间空格的方法------利用for循环(注意左右区间的开闭)

15.神秘字符(字符串)

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
int main() {
    int n;
    cin >> n;
    getchar();    //吸收n后的一个回车
    for(int i = 1; i <= n; i++){
        string s, t;
        // getline(cin, a);
        // getlinr(cin, b);
        cin >> s >> t;
        
        string result = "";
        for (int i = 0; i < s.size() / 2; i++) {     //处理s的前半段
            result += s[i];
        }
        result += t;   //添加 字符串t
        for (int i = s.size() / 2; i < s.size(); i++) {   //处理后半段的字符
            result += s[i];
        }
        cout << result << endl;
    }
}

16.位置互换

比较简单,字符反向

cpp 复制代码
#include<iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    while(n--) {
        string s;
        cin >> s;
        for(int i = 0; i < s.size() - 1; i += 2) {
            char c = s[i];
            s[i] = s[i + 1];
            s[i + 1] = c;
        }
        cout << s << endl;
    }
}

17.出栈合法性(栈)

注意本道题的出入栈不是说他一定是一次性入完后再出的。

cpp 复制代码
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int main(){
    int n;
    int nums[105];
    while (cin >> n) {
        if (n == 0) break;
        for (int index = 0; index < n; index++) cin >> nums[index];     //输入数组
        stack<int> st;
        int index = 0;
        for(int i = 1; i <= n; i++){
            st.push(i);
            while (!st.empty() && st.top() == nums[index]) {    //判断如果相等则出栈。但要注意在此之前一定要进行是否栈空的判断
                st.pop();
                index++;
            }
        }
        if(st.empty() && index == n) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
}

18.链表的基本操作(链表)

相关推荐
Kalika0-042 分钟前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20241 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh3 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy3 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java3 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli3 小时前
滑动窗口->dd爱框框
算法
丶Darling.3 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5203 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng19914 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂4 小时前
实验4 循环结构
c语言·算法·基础题