zoukankan      html  css  js  c++  java
  • 2020百度之星程序设计初赛(二)

    Poker

    注意p的类型为浮点型即可

    Distance

    给出n个点距离点(x0,y0)的曼哈顿距离,问这些点两两之间的最小距离和是多少?(1≤n≤100000)

    思路:暴力法可知,计算每个距离的贡献,a[i+1]-a[i]的贡献是(i)*(n-i+1)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e6+5;
    ll n,a[N];
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int t; cin>>t;
        while (t--) {
            ll ans=0;
            cin>>n; for (int i=0; i<n; i++) cin>>a[i];
            sort(a,a+n);
            for (int i=0; i<n-1; i++) {
                ans+=(a[i+1]-a[i]) * (i+1) * (n-i-1);
            }
            cout<<ans<<'
    ';
        }
        return 0;
    }
    

    Car

    W 市最近面临了严重的交通拥堵问题,现在决定要在工作日(周一到周五)限号。
    每天可以限制若干尾号的车辆,譬如说周一限尾号为 0 的车,周二限尾号为 1,2 的车。

    每个尾号在五天当中最多只能被限一次,一天也可以什么牌照都不限。
    我们要设置一个容量上限 m,使得至少存在一种方案,每一天不被限号的车的总数都≤m,请求出最小的 m
    (n表示这个城市里有多少辆车,1≤n≤10000)

    思路:虽然n很大,但是只有五天是限号的,而且限号的车牌尾数只有0~9,所以暴搜每一天限制的车牌即可
    难点在于都懂题目,不知道m是干嘛的,如何表示,所以第一次dfs写成了这种

    void dfs(int i) {
        if (i>=4) {
            int m=limit[0];
            for (int j=1; j<=4; j++) m=max(m,limit[j]); //
            ans=min(ans, m);
            return;
        }
        for (int k=0; k<10; k++) {
            limit[i]-=c[k]; //一开始限制n辆,对于第i种车释放了c[i]辆
            dfs(i+1);
            limit[i]+=c[k];
        }
    }
    

    上面的dfs错的地方是:题意说每一天都可以限号也可以不限号,而上面的代码的意义就变为了每一种牌号可以被限制或不被限制
    所以,应该换一下状态表示

    #include<bits/stdc++.h>
    using namespace std;
    int ans, c[15], limit[6]; //c[i]记录尾号为i的车的数量,limit[i]记录星期i限制的车辆总数
    void dfs(int i) {
        if (i>9) {
            int m=limit[0];
            for (int j=1; j<=4; j++) m=max(m,limit[j]); //
            ans=min(ans, m);
            return;
        }
        for (int k=0; k<=4; k++) {
            limit[k]-=c[i]; //一开始限制n辆,对于第i种车释放了c[i]辆
            dfs(i+1);
            limit[k]+=c[i];
        }
    }
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        int t; cin>>t;
        while (t--) {
            ans=0x3f3f3f3f;
            int n; cin>>n, memset(c,0,sizeof c); 
            for (int i=0; i<n; i++) {
                string s; cin>>s;
                c[s.back()-'0']++;
            }
            for (int i=0; i<5; i++) limit[i]=n; //一开始假设每一天车牌都全部限制,该死的memset
            dfs(0); //
            cout<<ans<<'
    ';
        }
        return 0;
    }
    
  • 相关阅读:
    韩国新地图格式
    这次是真的准备出售用于传奇开发的HGE图形引擎了
    减小Delphi2010程序的尺寸(关闭RTTI反射机制)
    hook api 保护进程
    使用静态库
    iOS中的Block动画
    IOS中忽略字符串两边空格比较
    判断是否输入有汉字
    EasyDSS产生cache缓存如何设定定时清理缓存?
    EasyDSS定制项目中ETCD服务挂掉如何设定定时重启?
  • 原文地址:https://www.cnblogs.com/wdt1/p/13901879.html
Copyright © 2011-2022 走看看