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;
}
原文地址:https://www.cnblogs.com/wdt1/p/13901879.html