PAT icon indicating copy to clipboard operation
PAT copied to clipboard

[Advanced/C++/1044] 学姐你好,今天刷到1044道题目的时候发现可以用贪心算法解决,发现时间复杂度可以降低为n

Open CaiNiaoHui opened this issue 6 years ago • 1 comments

以下是我一些鄙谏,希望学姐能多多指教。 大概就是用i和j的指向位置遍历整个数组,似乎和最小子序列差不多。

#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> dia;
vector<int> diaBegin, diaminBegin;
vector<int> diaEnd, diaminEnd;
int tempmin=99999999;
void findBE(int n,int m){
    int i=1,j=i;
    int temp=dia[1];
    while(j<=n){        
        if(temp<m){
            j++;
            temp += dia[j]; 
        }   
        else if(temp==m){
            diaBegin.push_back(i);
            diaEnd.push_back(j);
            j++;
            temp += dia[j]; 
        }else{
            if(diaBegin.size()==0){
                if(temp-m<tempmin){
                    if(diaminBegin.size()!=0&& diaminEnd.size()!=0){
                        diaminBegin.pop_back();
                        diaminBegin.push_back(i);
                        diaminEnd.pop_back();
                        diaminEnd.push_back(j);
                        tempmin = temp-m;//更新 
                    }else{
                        diaminBegin.push_back(i);
                        diaminEnd.push_back(j);
                        tempmin = temp-m;
                    }
                }else if(temp-m == tempmin){
                    diaminBegin.push_back(i);
                    diaminEnd.push_back(j);
                }
            }
            //记录min数组时候,i向后移动一位
            temp -= dia[i];
            i++;            
        }
    }
}
int main(){
    int n,m;
    scanf("%d %d",&n, &m);
    dia.resize(n+1);
    for(int i=1; i<=n; i++){
        scanf("%d", &dia[i]);
    }
    findBE(n,m);
    if(diaBegin.size()!=0 && diaEnd.size()!=0){
        for(int i=0; i<diaBegin.size(); i++){
            printf("%d-%d\n",diaBegin[i],diaEnd[i]);
        }
    }else{
        for(int i=0; i<diaminBegin.size(); i++){
            printf("%d-%d\n",diaminBegin[i],diaminEnd[i]);
        }
    }
    return 0;
}

上次的pat成绩考的不太乐观,希望在学姐的博客指导下,快速提高实力。 希望学姐能够多多更新,最好在代码里面多多加一些备注方便理解,有时题目搞不懂一步步调试的时候真是崩溃╯︿╰ 最后祝愿学姐越来越漂亮,越来越聪慧,永远支持学姐(^-^

CaiNiaoHui avatar Apr 29 '19 15:04 CaiNiaoHui

忘记写了,题目是1044. Shopping in Mars (25)-PAT甲级真题ˋ( ° ▽、° )

CaiNiaoHui avatar Apr 29 '19 15:04 CaiNiaoHui