NOIP 2016提高組 Day2 蚯蚓

直覺 用大根堆堆 用STL的priority_que 實現的; 過了七組數據,還有13組數據未過

#include <bits/stdc++.h>
using namespace std;
const int MM=100000;
int n,m,q,u,v,t;
//那隻蚯蚓  m:時間 q:增加的長度   p=u/v
int qiuyin[MM];
vector<int> qiuyin2;

priority_queue<int> que;

int main(){

    cin >> n >> m >> q >>u >> v>>t;

    for(int i=0;i<n;i++){
        cin >> qiuyin[i];
    }

    for(int i=0;i<n;i++){
        que.push( qiuyin[i] );
    }


    for(int i=1;i<=m;i++){
        int large = 0;
        if(!que.empty()) {
                large = que.top();
                que.pop();
                if( i>=t && i%t==0) cout << large << " ";

            }



        qiuyin2.clear();
        while(!que.empty()){
            qiuyin2.push_back(que.top());
            //cout<< "debug :"<<que.top() << " "<<endl;
            que.pop();
        }

        for(int j=0;j<qiuyin2.size();j++){
            qiuyin2[j] += q;
            que.push(  qiuyin2[j] );
        }

        //double p= 1.0*u/v;
        //cout <<"debug p" << p<<endl;
        int new1= int( 1.0*large*u/v);
        int new2= large- new1;
        //cout<<"debug: new1 new2"<< new1 <<"  "<< new2<<"  "<<endl;
        que.push(new1);
        que.push(new2);

    }

    cout << endl;
    int ge=0;
    while(!que.empty()){
        int temp=que.top(); que.pop();
        ge++;
        if( ge>=t && ge%t==0) cout << temp << " ";
    }

	return 0;
}


收到網上“”記錄時間戳“的思路的啓發”,將所有的蚯蚓長度都折算到0時刻的長度(可能有負值)

通過了了16組數據,還有4組數據未通過。

#include <bits/stdc++.h>
using namespace std;
const int MM=100000;
int n,m,q,u,v,t;
//那隻蚯蚓  m:時間 q:增加的長度   p=u/v
int qiuyin[MM];


priority_queue<int> que;  //記錄0時刻的蚯蚓的長度

int main(){

    cin >> n >> m >> q >>u >> v>>t;

    for(int i=0;i<n;i++){
        cin >> qiuyin[i];
    }

    for(int i=0;i<n;i++){
        que.push( qiuyin[i] );
    }


    for(int i=1;i<=m;i++){

          int large = que.top() + (i-1)*q;
          que.pop();
          if( i>=t && i%t==0) cout << large << " ";




        int new1= int( 1.0*large*u/v);
        int new2= large- new1;
       // cout<<"debug: new1 new2"<< new1 <<"  "<< new2<<"  "<<endl;
        que.push(new1 - i*q);
        que.push(new2 - i*q);

    }

    cout << endl;
    int ge=0;
    while(!que.empty()){
        int ans=que.top() + m * q;
        que.pop();
        ge++;
        if( ge>=t && ge%t==0 && ans>=0 ) cout << ans<< " ";
    }

	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章