第一题好巧妙,学习了.贴一下我的

#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;
}