因为题目对自己来说有点难,自己编代码编了好长时间才做对,记录一下自己的错误与思路。 题目:小白找好区间1(来自武汉工程大学第七届ACM新生赛(热身赛))链接:https://ac.nowcoder.com/acm/contest/95121/C 原先并没有写出来这道题。比赛结束后看了别人交的代码,整理了一下后才有了方法。
- 对于一个区间内好区间与坏区间谁更多这个问题,除了设置两个变量比大小外,可以直接另编一个数组好区间就用1表示,坏区间就用-1表示,对于特定子集内的多少,只需要求和就可以了,如果和大于1,说明好区间更多。因为觉得这个思路很巧妙,就记录下来了。
- 对于题目中这类的“子区间”可以用三层for循环来概括。即如果有一个数组arr[n],要在arr[n]中找出题目中的所有的区间并求每个子区间的和就可以用以下代码: for(int i=0;i<n;i++) for(int j=i;j<n;j++) { int sum=0; for(int a=i;a<=j;a++) sum+=arr[a]; }
- 尴尬的是,自己最开始看不懂代码,找豆包问了后还理解了半天才弄明白。更尴尬的是,自己写的代码一堆错,一直不对。最后总结了两个影响最大的错误。
- 输入字符数组时因为嫌麻烦,一直用的for循环: for(int i=0;i<n;i++)scanf("%c",&arr[i]); 这就导致如果输入“byl byl abc”之类的字符的话,经常会由于把换行符号录入字符数组中,导致结果出错。 之后把代码改成scanf(“%s”,arr)之后才解决这个问题。
- 原先的循环是这样的: for(int i=0;i<n;i++) for(int j=i;j<n;j++) { int sum=0; for(int a=i;a<=j;a++)//这里原先是用的a<j,后来发现不对,如果这样的话,只有 sum+=arr[a]; 一个数的子数组不会参与进去。 }
- 最后是我的代码:
#include <iostream>
int main()
{
int n=0,b=0;
char arr[4];
scanf("%d",&n);
int arr1[n];
int j=0;
for(int i=0;i<n;i++)
{
scanf("%s",arr);
if(arr[0]=='b'&&arr[1]=='y'&&arr[2]=='l')
arr1[j]=1;
else
arr1[j]=-1;
j+=1;
}
for(int j=0;j<n;j++)
for(int i=j;i<n;i++)
{
int rum=0;
for(int a=j;a<=i;a++)
rum+=arr1[a];
if(rum>0)
b+=1;
}
printf("%d",b);
return 0;
}
听说循环次数多的话不能算好代码,因为难看懂,不过我目前只能用这种方法解出这道题,相信以后会有更多好的方法。