算法笔记之第三章

简单模拟
题目怎么说你就怎么做

3n+1猜想:如果是偶数则砍掉一半,如果是奇数则把(3n+1)砍掉一半,对给定的任一不超过1000的正整数n,需要多少步才能得到n=1?

思路:读入n,用while反复判断n是否为1
如果为1,则退出循环
如果不为1,判断是否为偶数,n/2;如果为奇数,(3n+1)/2,然后令计数器step加1.

#include <iostream>
using namespace std;
int main() {
    int n,step=0;
    cin >> n;
    while(n!=1){
        if(n%2==0){
            n/=2;
        }else{
            n=(3*n+1)/2;
        }
        step++;
    }
    cout << step;
    return 0;
}

挖掘机技术哪家强
输入:第一行给出不超过 1 0 5 10^5 的正整数N,即参赛人数。随后N行每行给出一位参赛者的信息和成绩,包括其代表的学校的编号以及比赛成绩,中间以空格分隔。

输出:一行中给出得分总分最高的学校编号及分数,中间以空格分隔。

思路:令数组school[maxn]记录每个学校的总分,初值为0.对每一个读入的学校schID与其对应的分数score,令school[schID]+=score
令k记录最高总分学校编号,MAX记录最高总分,初值为-1.枚举1~N,不断更新k和MAX

#include <stdio.h>
#include <iostream>
using namespace std;
const int maxn = 100010;
int main() {
    int school[maxn]={0},N,schID,score;
    cin >> N;
    for(int i=0;i<=N;i++){
        scanf("%d %d\n", &schID, &score);
        school[schID]+=score;
    }
    int k=0, MAX=-1;
    for(int i=0;i<=N;i++){
        //注意接下来k并不参与运算;
        if(school[i]>=MAX){
            MAX=school[i];
            k=i;
        }
    }
        cout << k << " " << MAX;
        return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44770248/article/details/89683027