第一题好巧妙,学习了.贴一下我的 #include <iostream> #include<vector> #include<climits> using namespace std; int main() { //前缀和思想,加剪枝 int n; int k; int max_val = INT_MIN; while(cin>>n){ vector<int> nums(n, 0); cin>>nums[0]; for(int i=1;i<n;++i){ cin>>nums[i]; nums[i] += nums[i-1]; } cin>>k; for(int i=n-1;i>=0;--i){ if(max_val<i+1 && nums[i]%k==0){//剪枝 max_val = i+1; break;//剪枝 } } for(int i=0;i<n;++i){ for(int j=n-1;j>=i;--j){ if(max_val<j-i){ if((nums[j]-nums[i])%k==0){//剪枝 max_val = j-i; } } else//剪枝 break; } } cout<<max_val<<endl; } return 0; } 第二题 #include <iostream> #include<vector> #include<climits> using namespace std; int main() { //思路:分析样例发现,当某个数大于其他数的和时,只用从这个最大数开始.然而因为该数大于其他书的总和,所以分完其他所有人以后,还是有书剩余.不符合条件. //代码较简单 int n; int sum; while(cin>>n){ vector<int> nums(n, 0); bool flag = true; for(int i=0;i<n;++i){ cin>>nums[i]; sum += nums[i]; } for(int i=0;i<n;++i){ if(nums[i]*2>sum){ cout<<"No"<<endl; flag = false; break; } } if(flag) cout<<"Yes"<<endl; } return 0; }