【PAT刷题笔记】B1001、B1032、A1002(存疑)------待解决

B1001 害死人不偿命的(3n+1)猜想

循环用得太多,导致超时。学习简化代码
循环用得太多,导致超时。学习简化代码。能把多个循环合在一起,就合!

正确代码

#include <stdio.h>

int main()
    {
    
    
        int n=0,cnt=0,sum=0;
        scanf("%d",&n);
        for(;n!=1;)
        {
    
    
            if(n%2==0){
    
    
                n=n/2;
                cnt++;}
            else
            {
    
    
                n=(3*n+1)/2;
                cnt++;
            }
        }
            
    printf("%d",cnt);
    
        return 0;
    }

B1032 挖掘机技术哪家强 (20分)

在这里插入图片描述
一开始的思路,用了两个数值num[],scr[],存放校名和分数。
读入数组很好实现,计算是难点。
相同校名的分数相加,即num[a]=num[b]时,把scr[a]和scr[b]相加。
怎么判断num[a]=num[b]呢?
前者a不动,后面b去遍历,找到一个合适的和a匹配。
这样就要来两轮循环。

做题标准是又快又好,循环会增加计算时间,很有可能超时。
代码粘在这了,有兴趣的话,补全下,试试会不会超时。

#include <stdio.h>

int main()
{
    
    
    int n,cnt;
    int num[n],scr[n];
    scanf("%d",&n);
    for(cnt=0;cnt<n;cnt++)//读入所有数据
    {
    
    
        scanf("%d %d",&num[cnt],&scr[cnt]);
        
    }
    
    
    //计算所有数据
    for(cnt=0;;)
        if(;num[cnt]==num)
    return 0;
}

学习《算法笔记》中的思路。
只需要一个数组,大大简化。
school[ID]+=score

正确代码

#include <cstdio>
 const int maxn=100010;
    int school[maxn]={
    
    0};

int main()
{
    
    
   int n,num=0,score=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
    
    
        scanf("%d %d",&num,&score);
        school[num]+=score;//每读一次,加一次
        //学校的编号是从1开始的,所以读进来的num>=1
    }
    
    int MAX=0,MAXN=0;
        
    for(int i=1;i<=n;i++)//这边是对school[]存在的数进行比较,从school[1]开始
    {
    
    
        if(school[i]>MAX){
    
    
            MAX=school[i];
            MAXN=i;
                          }
    }
    printf("%d %d\n",MAXN,MAX);
    return 0;
}

学校的编号是从1开始的,所以读进来的num>=1
这边是对school[]存在的数进行比较,从school[1]开始


建议审题一定要仔细!!!做之前把所有的要点都列出来!!


A1002 A+B for Polynomials (25分)

k是多项式中非零项的数目
因为题目读错,所以导致理解偏差。需要提高英文水平和阅读能力。

还未解决
还未读懂柳神代码

在OJ上的残留代码

#include <stdio.h>
const int maxn=1000;
int main()
{
    
    
    int n=0,cs=0,i;
    float xs=0;//系数他是一个浮点数
    int input[maxn]={
    
    0};
    
    scanf("%d",&n);
    for(i=0;i<2;i++)//两行
    {
    
    
        scanf("%d %f",&cs,&xs);//scanf里的float用%f;printf里的float用%lf
        input[cs]=input[cs]+xs;//把系数加起来
    }
    //判断
    printf("%d",n);
    
    for(;;n--)
    {
    
    
        printf("")
    }
    
}

猜你喜欢

转载自blog.csdn.net/admiumiu/article/details/107462160