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;
    }
    
  • 相关阅读:
    php命令注入
    mysql事物
    安装php环境
    移除服务器缓存实例
    show user profile synchronization tools
    manual start user profile import
    JSON is undefined. Infopath Form People Picker in SharePoint 2013
    asp.net web 应用站点支持域账户登录
    Load sharepoint envirement by powershell
    sharepoint 2016 download
  • 原文地址:https://www.cnblogs.com/wdt1/p/13901879.html
Copyright © 2011-2022 走看看