这题没有想到比较好的100分解题思路。但是编译的时候还是有些地方错了,需要小心。
题目链接
在编码的时候碰到了问题。
- 首先using namespace std切记一定要加!不然就会编译错误!
- 然后,定义变量统一在开头!自己是因为忘了定义sumer结果编译出错又找了好久,另外在打for这些打时候同时要打{}以免忘记。
- <=和>=不要打错,先比较后等号。
- 编码的时候一定要关注核心逻辑,得10分一般都是IO以及判断部分没有问题,数据处理与生成的逻辑有问题。
- 当然拿到题目需要先考虑一下得到满分的算法好不好做,会不会做。如果做不出来再考虑用暴力解法。
- 通常情况下push_back这种复杂度为O(1)的操作以及在函数中初始化vector都不会影响最终的结果。
看到这题首先的思路还是暴力法,但是自己耍了个小心眼,对输入的数据先进行排序,然后从小到大取数。比如:输入为 [ 3 , 1 , 2 , 0 , 0 , 2 , 0 , 4 , 5 , 0 , 2 ] [3,1,2,0,0,2,0,4,5,0,2] [3,1,2,0,0,2,0,4,5,0,2],排序并取独立值之后得到 [ 0 , 1 , 2 , 3 , 4 , 5 ] [0,1,2,3,4,5] [0,1,2,3,4,5],然后一个一个自小至大尝试,如果后一个比前一个小就退出,结果只得了10分。。发现是逻辑有问题,删掉那个逻辑之后得了70分。后面想了想其实也是有更好的方法的,因为这个本质上也可以用动态规划做。但是已经写了2个小时了,于是还是放弃。
#include#include #include using namespace std; bool charge(int i,int j,vector arr){ bool flag1=false; bool flag2=false; bool flag3=false; if(i>=0&&i<=j&&j<=arr.size()-1)flag1=true; if(i==0||arr[i-1]==0)flag2=true; if(j==arr.size()-1||arr[j+1]==0)flag3=true; for(int k=i ;k<=j;k++){if (arr[k]<=0){return false;}} if(flag1&&flag2&&flag3)return true; return false; };//判断代码,满足4个条件返回true. vector change(int changenum,vector arr){ vector newarr; for(int i=0;i arr){ int sum=0; int i=0;int j=0;int si=arr.size(); while(j >num; vector arr(num,0); vector arr2(num,0); int i,j,temp; for (i=0;i>temp; arr[i]=temp; arr2[i]=temp; } sort(arr2.begin(),arr2.end()); vector arr3; arr3.push_back(arr2[0]);j=0; for(i=1;inewarr=change(arr3[i],arr); num2=getsum(newarr); if(sumer<=num2){sumer=num2;} }//核心逻辑部分 cout<



