c++实验5——数组分离

一、问题及代码

/*      
* 文件名称:Ex5-1.cpp      
* 作    者:叶瑞琪    
* 完成日期:2017 年 5月 3日      
* 版 本 号:v1.0      
* 对任务及求解方法的描述部分:     
* 输入描述:无      
* 问题描述: 分离数组 
* 程序输出: 略  
* 问题分析:略     
* 算法设计:略      
*/    
#include <iostream>  
using namespace std;  
int main()  
{  
    int a[10],b[10],c[10],
          i,x=0,y=0;  
        for(i=0;i<10;i++)  
        cin>>a[i];  
        for(i=0;i<10;i++)  
    {  
        if(a[i]%2==0)  
           b[x++]=a[i];  
       else  
           c[y++]=a[i];  
   }  
       for(i=0;i<x;i++)  
           cout<<b[i]<<" ";  
           cout<<endl;  
       for(i=0;i<y;i++)  
           cout<<c[i]<<" ";  
           cout<<endl;  
      return 0;  
}  


二、运算结果


三、结论

       数组中每个成员称为数组元素,各数组元素用下标加以区别。数组的下标写在数组名后的方括号中,且元素的下标从0开始计数,每次递增1

四、心得体会

        c++课需要认真听讲。每一个知识点都不能落下。


### C++ 中分割数组的方法 在 C++ 编程中,分割数组通常涉及将一个连续的数组划分为多个子部分。这种操作可以通过多种方式实现,具体取决于需求背景和目标功能。以下是基于给定引用内容以及常见场景下的几种方法。 #### 方法一:通过索引手动划分 可以利用循环遍历的方式,按照指定条件或位置来创建两个新的子数组 `left` 和 `right`: ```cpp #include <iostream> #include <vector> using namespace std; void splitArrayByIndex(const vector<int>& nums, int index, vector<int>& left, vector<int>& right) { for (size_t i = 0; i < nums.size(); ++i) { if (i <= index) { left.push_back(nums[i]); } else { right.push_back(nums[i]); } } } int main() { vector<int> nums = {5, 0, 3, 8, 6}; int index = 2; vector<int> left, right; splitArrayByIndex(nums, index, left, right); cout << "Left Array: "; for(auto num : left) cout << num << " "; // Output Left Part cout << "\nRight Array: "; for(auto num : right) cout << num << " "; // Output Right Part return 0; } ``` 这种方法适用于简单的按固定索引切割的情况[^1]。 #### 方法二:动态规划求解最大值最小化问题 当涉及到更复杂的逻辑,比如寻找一种最优切分方案使得某些指标达到最小时,则可能需要用到高级算法技术——例如动态规划或者二分查找法结合贪心策略。下面展示了一个例子关于如何计算分割后的最大子数组和尽可能小的情形: ```cpp class Solution { public: bool canSplit(vector<int>& nums, long mid, int m){ int count=1,sum=0; for(int num:nums){ sum+=num; if(sum>mid){ count++; sum=num; if(count>m)return false; } } return true; } int splitArray(vector<int>& nums, int m) { long maxNum=*max_element(nums.begin(),nums.end()); long totalSum=accumulate(nums.begin(),nums.end(),(long)0); if(m==1)return totalSum; long l=maxNum,r=totalSum,res=-1; while(l<=r){ long mid=(l+r)/2; if(canSplit(nums,mid,m)){ res=mid; r=mid-1; } else{ l=mid+1; } } return res; } }; // Test Case Example from Reference int main(){ Solution sol; vector<int> test={1,2,3,4,5,6}; cout<<sol.splitArray(test,2)<<endl;// Expected output is 11. return 0; } ``` 此代码片段实现了 LeetCode 上经典的 “分割数组的最大值” 题目解决方案^。 #### 方法三:双指针技巧解决特定条件下两半分开的问题 对于一些特殊类型的题目,如需找到某个点让左侧所有元素均小于右侧所有元素时可采用如下思路: ```cpp #include<bits/stdc++.h> using namespace std; int partitionDisjoint(vector<int>& A) { int N=A.size(); vector<int> L(N), R(N); L[0]=A[0]; for(int i=1;i<N;++i)L[i]=max(L[i-1],A[i]); R[N-1]=A[N-1]; for(int j=N-2;j>=0;--j)R[j]=min(R[j+1],A[j]); for(int k=0;k<N-1;++k){ if(L[k]<=R[k+1])return k+1; } return -1; } int main(){ vector<int> input={5,0,3,8,6}; cout<<partitionDisjoint(input)<<endl; // Should print '3' return 0; } ``` 上述程序展示了另一种形式上的数组分离过程[^3]. ### 总结 以上介绍了三种不同层次复杂度下处理C++环境下数组分割的技术手段。从基础的手动拆分到运用高效数据结构与算法完成优化任务均有涉猎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值