点到为止的入门班循环结构习题题解(1001——1055)
习题集链接:https://ac.nowcoder.com/acm/contest/19305
1028摸了
这个题解好就好在你看之前不会,看之后也不一定会,不影响正常做题
万一你看完就悟了呢
只提供思路和关键点,偶尔整活,想ctrl+c ctrl+v秒题的请出门右转
1001
嵌套循环,然后找规律
顺带一提没记住scanf和cin的返回值就来复习一下吧
while(~(scanf("%d",&n)))//成功(读到了)数据数量,不匹配0,失败EOF(-1)
~是按位取反
/*转:cin>>n返回的也是一个cin对象,当一个cin对象作为条件选择、循环等的控制表达式时, 编译器会将其转换为真值表达式*/ while(cin>>a)//成功(读完了)true,不匹配或失败false
1002
内层循环结束条件用i
printf("%4d",a++);
1003
printf("%c",'A'+j);
1004
同1001
1005
实际上是1004两倍空格还换了n,改改就能用
1006
判断%2也行,flag*=-1也行,随你
1007
tips:输出记得用&f(cout当我没说)
1008
显然我更喜欢插旗
for(i=1;i<=n;i++){ a+=flag*(i*2-1); sum+=(double)1/a; flag*=-1; }
1009
a+=i;sum+=a;
1010
三个变量也行,数组也行,递归也行,随你
1011
这是数组
L[i]=L[i-1]+L[i-2]*2+L[i-3];//int L[1011]={0,1,1} 这是初值
1012
热知识:cin是有返回值的
真不会请出门右转1001
1013
1012
1014
1013
你愿意的话可以把n吃了
1015
if(!a && !b)break;
1016
while(~(ch=getchar()))
排除‘ ’‘\n’然后用计数器,上课讲过别的方法但是我忘了录播还没传
1017
写了个优化版,暂时想不到时间复杂度怎么继续压(虽然正常遍历怎么着都不会TLE就是)
int judge(int n){ if(!(n%4)){ return n+1; } for(int i=0,tmp=n;tmp;i++){ if(tmp%10==4){ return (int)(n/pow(10,i)+1)*pow(10,i);//跳过所有当前位是4的数 } tmp/=10; } cout<<n<<endl; return n+1; }
想必你已经知道主函数里有啥了
1018
还好是整型
左右移不动符号位,然后unsigned没有符号位,懂吧
while(n){ cnt+=n&1; n>>=1; }
1019
循环判断N&1,有就+=pow(k,i),i的初值是0,然后N右移
应该是这个思路,然而我在整活
while(N){ sum+=(N&1)*(a*=k); N>>=1; } cout<<sum/k;
1020
把上一题的代码改改用了
记得每次循环完重置那堆变量的值
1021
内层循环也要判断n,不太能一组一组加
for(j=0;j<J&&i+j<n;j++){ sum+=J; } J++;
1022
说明一下,收50只能找25,收100没有50就找3张25,每次找完判断25数量负没负
(100又不能拿来找记它数做啥)
switch(a){ case 25: c25++; break; case 50: c50++,c25--; break; case 100: if(c50>0){ c50--,c25--; }else{ c25-=3; } } if(c25<0)flag=0;
1023
读一个S和T加一个,不用数组
1024
m=n%a?(n/a+1)*b:n/a*b;
题外话:我刚开始没看到题目里决定只买同一种包装的铅笔,写半天一测不对又调半天,裂开
1025
switchcase
1026
数组存储,大到小排序,然后循环
if(L[i]<=i){ break; }
至于怎么排见仁见智,我懒就用快排了,以前题解应该有
1027
题目说明的详细程度已经超过题解了。。
cnt记得重置
1028
待补充
1029
到sqrt(n)就可以不用判了,特判1
1030
因数个数奇Nancy,偶Johnson
然后这题就变成了分解质因数
for(i=2;n>1;i++){ if(!(n%i)){ cnt++; n/=i; i--; } }
记得特判质数
1031
听说过三角形数吗
for(i=0;i*(i+1)/2<N;i++);
然后斜着看,奇数排右往左偶数左往右
1032
maxmin赋输入数据边界外的初值,懒得读题就用int边界(-2147438648 2147483647),读一个比一个
然而我条件反射qsort了,别学
qsort(L,n,sizeof(long long),cmp); //没读题用longlong属于是 printf("%lld",L[n-1]-L[0]);
1033
sum=0,读完除以n,然后同1032
1034
和为奇数就把最小的奇数丢了,循环里判min前加个条件就行
printf("%d",sum%2?sum-min:sum);
虽然没说明但是测试点里没有负数个糖果(倒不如说觉得这个要说明的我有问题)
1035
四个变量存呗,坑应该在不能一样大
用数组的记得去重
记得去重!
1036
mid是杆子正中,min是蚂蚁离mid最近的距离(fabs)
printf("%.0f",mid-min);
1037
两只蚂蚁相撞之前一只往左跑一只往右,在相撞点掉头,还是一只往左一只往右
等效于撞了没转向
理解了这个这题就变得很简单
a=flag?n-a:a;
备注:相撞指距离为0,转向不需要时间,我刚开始写没想明白这两点卡了好久
_ _ X> _ <X _ _ _ _ X> _ <X _ _ _ _ _ X> X< _ _L _ _ _ X> X> _ _ R _ _ _ (X> <X) _ _ _B _ _ _ <X X> _ _L _ _ _ <X _ X> _ R _ _ <X _ X> _ _B / _ _ _ (<X X>) _ _ _? //钻牛角尖实录
1038
cnt=ch=='a'?cnt+1:cnt;
1039
被吃了
1040
cout<<(ch!='5'?ch:'*');
1041
跟3n+1猜想那题还是有点区别的,当然,只有一点
1042
cnt=h+30>=L[i]?cnt+1:cnt;
1043
月结余
rest+=300-a;
判断够不够
if(rest<0 && !flag)flag=-i-1;
存整百
save+=rest/100*100;
没了
1044
加一次比一次成了就break
1045
要考虑前半后半1415跨周期。。
但是我懒,用长度32的数组([30][31]放0,1考虑跨周期),直接遍历匹配输出下一个
if(a==L[j] && b==L[j+1]){ cout<<L[j+2]<<endl; break; }
1046
一个flag解决的题
上升,插旗;下降,有旗拔旗并计数,没有不管;
1047
不为负债就先买一次(记得统计空瓶瓶盖)再进循环,k<2 && g<4结束
1048
读数据之前用长1000的数组,过一遍三位数下标判断好数,是1否0
for(i=l;i<=r;i++){ cnt+=L[i]; }
读一次判一遍应该也行不会TLE 吧
1049
if( blabla && blablabla && blablablabla)
1050
数组存每位的数
for(k=0;k<j;k++,j--){ if(m[k]!=m[j]){ flag=0; break; } }
好像做复杂了
1051
前49题写累了来休息一下吧
1052
两层循环,i和j相当于坐标
printf("%.0f",fabs((double)i-2)+fabs((double)j-2));
1053
二维数组赋初值,有多少根自己数
cout<<L[0][a]<<' '<<L[1][a]<<endl;
用两个数组也行
1054
考虑系数1,-1,0(continue),首项不输出+号,最后两项x的格式
一堆if
看着写
1055
听说过辗转相除法吗
后记
累死了,零评那啥