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("")
}
}