2018-12-5 及 codeforces round 525v2

忽然發現五天沒記錄了,這五天學習徹底沒有按着正常規劃進行,先羅列一下吧。ios

  • 機器學習視頻第一週的所有看完了。
  • 算法導論看了幾頁。
  • 參加了一次CF。rating只加了20,看來提升實力纔是最關鍵的。
  • C++找到了侯捷老師的視頻。
  • 貌似記不得什麼了。
    記錄一下昨天的CF題解吧。
    題目連接:http://codeforces.com/contest/1088

A題:理論上能夠用暴力搜,可是除一以外全部的答案均可以寫成"x x",再也不寫代碼解釋。
B題:題意爲數組中的每個數每次都減去一個最小的數,並輸出這個數。能夠先排序,而後下面展現的是O(n)複雜度的算法。
算法

#include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[100005];
int main(){

    int n,k;
    scanf("%d%d",&n,&k);
    for(int i = 0; i < n; i++){
        scanf("%d",&a[i]);
    }
    sort(a,a+n);
    int sumsub = 0;
    int j = 0;
    while(k--){
        while(j <n && a[j] <= sumsub) j++;
        if(j == n) printf("0\n");
        else {
            printf("%d\n",a[j]-sumsub);
            sumsub = a[j];
        }
    }

    return 0;
}

C題:題目提到了兩個操做,要求在n+1個操做以內講數組變爲升序。能夠轉化爲前n個操做講n個數對n+1的餘數變爲遞增,而後最後一步對n+1取模。數組

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int a[10000];
vector<pair<int,int>> ans;
int main(){
    int n ;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++){
        scanf("%d",&a[i]);
    }
    int cnt = 0;
    int sum = 0;
    for(int i = n; i >= 1; i--){
        if((sum+a[i])%(n+1) == i) continue;
        else {
            cnt++;
            int d = (sum+a[i])%(n+1);
            if(i > d) {ans.push_back(make_pair(i,i-d));sum+=i-d;}
            else {ans.push_back(make_pair(i,n+1+i-d));sum+=n+1+i-d;}
        }
    }
    cnt++;
    printf("%d\n",cnt);
    for(int i = 0; i < cnt-1;i++){
        printf("1 %d %d\n",ans[i].first,ans[i].second);
    }
    printf("2 %d %d",n,n+1);

    return 0;
}

D題思路是對的,可是由於一些緣由沒有去作,否則可能此次就上藍了。機器學習

#include<iostream>

using namespace std;

int query(int a,int b){
    cout << "? "<<a<<" "<<b<<endl;
    int res;
    cin >> res;
    return res;
}
int a = 0,b = 0;
int main(){
    bool comp = (query(0,0) == 1);
    for(int i = 29; i >= 0; i--){
        int p = query(a,b|1<<i);
        int q = query(a|1<<i,b);
        if(p == 1 && q == -1){
            a = a|1<<i;
            b = b|1<<i;
        }else if( p == -1 && q == 1){
            continue;
        }else{
            if(comp) a = a|1<<i;
            else b = b|1<<i;
            comp = (p==1);
        }
    }
    cout << "! "<<a<<" "<<b<<endl;

    return 0;
}

之後天天都記錄一下吧

相關文章
相關標籤/搜索