2018-12-1學習紀錄

ACM 2.5h

下午一點鐘起牀洗澡完,到五點比賽結束,總共花了大概2.5個小時作題,作的效果不盡人意,只作出4題,第五題在5點以後調試成功。因爲水題爲主,我就簡單記錄一下。
題目連接:https://files-cdn.cnblogs.com/files/jinjin-2018/contest1inhdoj.pdf
linux

  • 第一題要求輸入多行數,區分一行內的數是否所有嚴格大於0。 錯誤點:遇到不知足的直接跳過,忽略了以後的輸入。
  • 第二題看起來要用lowbit(),可是因爲求指望值,想當於前綴和不變。
  • 第三題告知一個圓上的n個點以及他們分圓弧的長度,要求計算能夠構成多少個長方形,O(n²)的搜索便可。
#include<iostream>
#include<map>
using namespace std;
int pos[500] = {0};
int a[500] = {0};

int main(){
    int n;
    while(cin >> n){
        map<int,int> mp;
        int sum = 0;
        for(int i = 1; i <= n ; i++){
            pos[i] = sum;
            mp[sum] = i;
            int t;
            cin >> t;
            sum += t;
        }
        int cnt = 0;
        if(sum%2) {cout << 0 << endl;continue;}
        for(int i = 1; i <= n; i++){
            for(int j = i+1; j <= n; j++){
                int d = pos[j] - pos[i];
                if(d >= sum/2) break;
                int e = sum/2 - d;
                if( j < mp[pos[j]+e] && mp[pos[i]+sum - e] <= n && mp[pos[j]+e] < mp[pos[i]+sum - e]) cnt++;
            }
        }
        cout <<cnt<<endl;
    }
    return 0;
}
  • 第四題計算申請的變量佔多少K字節,因爲是向上取整,sum - 1 除以1024 + 1及爲答案,0做爲特殊狀況額外考慮。
  • 第五題作出的比較少,因爲比賽已經結束沒法驗證本身的解法是否正確。(開放後調試了一下已AC)思路就是2 * 3 * 4*...直到最大的一個,多出來的數加到以前的因子上,加的策略是從大往小的加。若是所有因子加了1還剩1,那麼就加在最大那個數上,大概是貪心的思想,代碼實現的比較醜陋,之後有機會能夠改善一下。
#include<iostream>
using namespace std;

long long f[20];
int nums[205];

void init1(){
    long long mul = 1;
    f[0] = 0;
    for(int i = 2; i <= 20;i++){
        mul *= i;
        f[i-1] = mul;
    }
    return ;
}
void init2(){
    int start = 5;
    int x = 5;
    for(int i = 4; i <= 20; i++){
        x += i;
        while(start < 202 && start < x){
            nums[start] = i-2;
            ++start;
        }
    }
}
int main(){
    int n;
    cin >> n;
    init1();
    init2();
    while(n--){
        int m;
        cin >> m;
        if(m == 1) cout << 1<<" "<<1<<endl;
        else if(m == 2) cout << 2 <<" "<<2<<endl;
        else if(m == 3) cout << 2 <<" "<<3<<endl;
        else if(m == 4) cout << 3 <<" " <<4<<endl;
        else{
            int k = nums[m];
            int ss = m - k*(k+3)/2;
            long long res;
            if(ss > k) res = f[k+2]/2/(k+2);
            else res = f[k+1]/(k+1+1-ss) ;
            cout <<m-1<<" "<<res<<endl;
        }

    }
    return 0;
}

CSAPP 1hour

晚上家教回來玩了會手機10:00就開始看啦,看到了11:40,可是效率不高,暫且按照1hour計算有效學習時間。
今天開始看第二章「信息的表示與處理」:
C11標準執行:
ios

linux> gcc -std=c11 prog.c

2.1信息存儲:字節是最小的可尋址的內存單元編程

  • 2.1.1 十六進制表示法:0x前綴,支持大小寫混合,練習了 10進制 <==>16進制<==>2進制的相互換算。記憶0xA = 1010B ,0xC = 1100B,0xF = 1111B十分有必要。
  • 2.1.2 字數據大小:
    可移植性
    64位機可選操做,體如今編譯上的差別:
linux> gcc -m32 prog.c
linux> gcc -m64 prog.c
  • 2.1.3 尋址和字節順序: 大端法與小端法:1.網絡(網絡標準解決)2.機器級代碼 3.系統型編程P31,明天解決。
相關文章
相關標籤/搜索