2018-12-1学习纪录

ACM

下午一点钟起床洗澡完,到五点比赛结束,总共花了大概2.5个小时做题,做的效果不尽人意,只做出4题,第五题在5点之后调试成功。由于水题为主,我就简单记录一下。

  • 第一题要求输入多行数,区分一行内的数是否全部严格大于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作为特殊情况额外考虑。
  • 第五题做出的比较少,由于比赛已经结束无法验证自己的解法是否正确。思路就是234*...直到最大的一个,多出来的数加到之前的因子上,加的策略是从大往小的加。如果全部因子加了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;
}

猜你喜欢

转载自www.cnblogs.com/jinjin-2018/p/10050310.html