Codeforces Round #686 (Div. 3)

Codeforces Round #686 (Div. 3)

Codeforces Round #686

A.Special Permutation

水题 直接先输出2-n,在输出1

#include <bits/stdc++.h>
using namespace std;

int main()
{
 
    int t;
    cin >> t;
    while(t--){
        int n;
        cin >> n;
        for(int i = 2; i <= n ; i++){
            cout << i << " ";
        }
        cout << 1 << endl;
    }
 
    return 0;
}

B. Unique Bid Auction

第二题写的时候最开始还没过,很郁闷,最后仔细想了下,发现最后for判断的时候只用判断a[i] > 0 而且只要有答案了直接就break就可以了。

写这个题可以反思一下

第一次没过不要紧,我debug的思路是从条件出发,就和做数学题一样,这个题主要的两个条件就是唯一性和最小性只要能把握这两点答案就肯定是正确的了

#include <bits/stdc++.h>
using namespace std;

const int maxn =2e5+10;
int a[maxn];

int main()
{

    int t; /// t -> 2e4
    cin >> t;
    while(t--){
        int n;  /// n -> 2e5 __. O(n);
        cin >> n;
        memset(a,0,sizeof a );
        for(int i = 1; i <= n ; i++){
            int temp;
            cin >>temp;
            if(a[temp] == 0){
                a[temp] = i;
            }
            else{
                a[temp] = -1;
            }
        }

        int win = 0;
        int winNum = 300000;
        for(int i = 1; i <= n; i++){
            if( a[i] > 0 ){
                win = a[i];
                winNum = i;
                break;
            }
        }

        if(win > 0) cout << win << endl;
        else cout << -1 << endl;
    }

    return 0;
}

C. Sequence Transformation

这个题,我炸裂。。。
我开始想的是要把每组数都筛出来,存下来,然后去csdn看了大佬的代码,是我想多了。。。。直接边读边判就可以

#include <bits/stdc++.h>
using namespace std;

void file()
{
    #ifdef ON
    #else
        freopen("d:/workProgram/test.txt","r",stdin);
    #endif

}
int a[1000000];

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    //file();
    int t ;
    cin >> t;
    map<int,int> mp;///记录上次这个数出现的位置;
    map<int ,int> mmp;///记录这个数的操作数;
    while(t--){
        int n ;
        cin >> n;
        if(n == 1){
            int temp;
            cin >>temp;
            cout << 0 << endl;
            continue;
        }

        mp.clear();
        mmp.clear();

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

            cin >> a[i];
            if( i - mp[a[i]] > 1 ){ ///i-mp[a[i]]是判断两个相同数是否相邻
                mmp[a[i]]++;
                mp[a[i]] = i;
            }
            else {
                mp[a[i]] = i;
            }
        }

        mmp[a[n]]--;///因为每个数字最后出现在哪是不确定的,如果不在最后一位
                    ///所以最后一个数先减1,后面会加回去的

        int ans = 0x3f3f3f3f;
        for(int i = 1 ; i <= n; i++){
            ans = min( ans, mmp[a[i]] + 1 );
        }

        cout << ans << endl;
    }
    //cout <<0x3f<<endl;
    return 0;
}


之前自己模拟的代码。。。

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int maxn =1e5 + 10;

int a[maxn];
PII pa[maxn];

void file()
{
    #ifdef ONLINE_JUDGE
    #else
        freopen("D:/workProgram/test.txt","r",stdin);
    #endif

}

bool cmp(PII a,PII b)
{
    return a.first < b.first;
}

int main()
{
    file();
    int t;
    cin >> t;
    while(t--){
        int n ;
        cin >> n;
        map<int,int> m;
        for(int i = 0; i < n; i++){
            cin >> a[i];
            pa[i].first = a[i];
            pa[i].second = i;
        }

        int flag = 1;
        for(int i = 1 ; i < n ; i++){
            //cout << pa[i].first << " "<<pa[i - 1].first<<endl;
            if(pa[i].first != pa[i - 1].first){
                    //cout << "no"<<endl;
                flag = 0;
                break;
            }
        }

        if(flag == 1){
            cout << 0 << endl;
            continue;
        }

        sort(pa,pa+n,cmp);
//        for(int i = 0 ; i < n ; i++){
//            cout << "I "<<pa[i].first << " "<<pa[i].second<<endl;
//        }

        set<int > q;
        int ans = 1000000;
        for(int i = 0 ; i  < n ; i++){
            if(pa[i].first == pa[i+1].first){
                q.insert(pa[i].second);
                continue;
            }
            if(pa[i].first != pa[i+1].first){
                q.insert(pa[i].second);
                q.insert(0);
                q.insert(n - 1);
//                for(auto item : q) cout << item << " ";
//                cout <<endl;
                int cnt = 0;
                int las = 0;
                for(auto item : q){
                    if(item != n-1){
//                        cout<<"I" << item << las << endl;
                        if( (item - 1 - las) != 0   ){
                            cnt++;
                            las = item;
                        }
                        else{
                            //cout<<"I " << pa[item].first << " "<< pa[item - 1].first<<endl;
                            if( a[item] == a[item - 1] ){
                                continue;
                                las = item;
                            }
                            else{
                                cnt++;
                                las = item;
                            }
                        }

                    }
                }
                if(cnt < ans)ans = cnt;
//              cout << cnt<<endl;
//              cout <<endl;
                q.clear();
            }
        }
        cout << ans<< endl;
    }


    return 0;
}

posted @ 2020-11-27 01:37  Hoppz  阅读(75)  评论(0编辑  收藏  举报