武汉高校联合程序设计新生赛

时间:2024-10-27 21:09:24

武汉高校联合程序设计新生赛

  • [A - 你好,HWCWHer]
  • [B - 全概率公式]
  • [D - 股票交易]
  • [E - Apple]
  • [G - Mobiusp的希望树]
  • [H - 父子局]
  • [I - 轮符雨]
  • [K - agKc 与太阳甩在身后]

2024.10.22 13:00————18:00

过题数7/14
补题数8/14
训练的时候还是全网无解析哈,不知道现在有没有。


[A - 你好,HWCWHer]

在这里插入图片描述

题解:
输出学校英文缩写。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long

void solve() {
    cout << "WHU";
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while(t--) {
        solve();
    }
}

[B - 全概率公式]

在这里插入图片描述
题解:
全概率公式是所有平台✖️相对应的污染概率相加和就是所求答案。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
int n;
double a[110],b[110];

void solve() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> b[i];
    }double ans;
    for (int i = 0; i < n; i++) {
        ans += a[i]*b[i];
    }cout << ans;
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while(t--) {
        solve();
    }
}

[D - 股票交易]

在这里插入图片描述

题解:
股票价格一定是整数,也就是说你的天数增加是不可能快于股票增加速度的。也就是当你找到差分最大的那俩天后,别的所有天只可能减小你的盈利,或者不改变,不可能再增大你的盈利。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
const int N = 1e5+10;
int n;
double a[N];

void solve() {
    cin >> n;
    double ans = 0;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        if(i >= 1) {
       //     cout << a[i] << ' ' << a[i-1] << endl;
            ans = max(ans,a[i]-a[i-1]);
        }
    }
   // cout << ans << endl;
    printf("%0.3f",ans);
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while(t--) {
        solve();
    }
}

[E - Apple]

在这里插入图片描述

题解:
好像是有个什么规律的吧,列几串数字下来可以发现。具体见代码。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
int n,k;

void solve() {
    cin >> n >> k;
    if(k == 1) cout << n << endl;
    else {
        int ans = 0;
        ans = (1+k-2)*(k-2)/2;
        if(ans+k > n) {
            cout << 0 << endl;
            return ;
        }
        n = n-ans;
        n = n/k;
        cout << n << endl;
    }

    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}

[G - Mobiusp的希望树]

在这里插入图片描述
题解:
二分判断最后一层节点的最大个数,check函数中dfs往上跑,继续判断能否实现这一层的最大节点数,直到它的上面一层变为0。判负情况要注意第一行不止一个节点,上一行没有节点。直接遍历确认上一层的最大起始起点,使得上一层的节点数尽量少一点。
具体见注释。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
int n;
bool st;

void dfs(int a,int b) {
    //cout << a << ' ' << b << endl;
    //最后一行有a个节点,最大的节点数是b
    int ls= -1;//最后一层所能储存的最大节点数
    int y = -1;
    if(a > b) return ;
    for (int i = b-a; i >= 1; i--) {
        //上一层的起始节点
        //t了再写二分吧
        ls = (i+b-a)*(b-a-i+1)/2;
        if(ls >= a) {
            y = i;
            break;
        }
    }
    //cout << b << ' ' << a << ' ' << y << endl;
    if(y == 1 && b-a!=1) {
        return ;
    }//第一个节点跟别人同层了
    if(y == -1)return ;
    if(b-a-y <= 0) {
        st = true;
    //    cout << "Ads" << endl;
        return ;
    }//此时这一层的节点只有一个了,不需要继续往上确认
    else dfs(b-a-y+1,b-a);
    return ;
}

bool check(int x) {
    //能否实现最后一行有x个节点
    st = false;
    dfs(x,n);
    return st;
}

void solve() {
    cin >> n;
    int l = 1,r = n-1;
    int mid;//最后一层节点的最大个数
    int ans=1;
    //cout << l << '/' << r << endl;
    while(l <= r) {
        mid = (l+r)/2;
    //    cout << l << '/' << r << endl;
        if(check(mid)) {
            l = mid+1;
            ans = mid;
        }else r = mid-1;
    }cout << ans << endl;
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    //cin >> t;
    while(t--) {
        solve();
    }
}


[H - 父子局]

在这里插入图片描述

题解:
x,y都必须大于n且不相等,令x????n+1,可以求得y????n*(n+1),所以1会输出-1.
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
int n;

void solve() {
    cin >> n;
    if(n == 1) {
        cout << -1 << ' ' << -1 << endl;
    }
    else {
        cout << n+1 << ' ' << n*(n+1) << endl;
    }
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}

[I - 轮符雨]

在这里插入图片描述
题解:
可以发现,期待值的总变化就是第一个与最后一个值的差,所以可以考虑找出所有的最大最小值,看能不能通过交换的方式,使得首位差值最大。注意有可能出现不交换反而是最大值的情况。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
const int N = 1e5+10;
int n;
int a[N];

void solve() {
    cin >> n;
    int ma = 0,mi = 1e9+10;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        ma = max(a[i],ma);
        mi = min(a[i],mi);
   //     cout << a[i] << ' ';
    }
    if(a[0] == ma || a[n-1] == mi) {
        cout << ma-mi << endl;
    }
    else {
      //  cout << n-1 << endl;
      //  cout << ma << ' ' << a[n-1] << ' ' << a[0] << ' ' <<mi << endl;
        int ans = max(ma-a[n-1],a[0]-mi);
        ans = max(ans,abs(a[n-1]-a[0]));
        cout << ans << endl;
    }
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}


[K - agKc 与太阳甩在身后]

在这里插入图片描述

题解:
要么以行为单位消完所有的结晶,要么以列为单位消完所有结晶,所以取二者较小值即可。
代码:

#include <iostream>
#include <set>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<string.h>
#include<map>
#include<math.h>

using namespace std;
#define int long long
int n,m,x,y;

void solve() {
    cin >> n >> m >> x >> y;
    int ls = min(n,m);
    if(ls == 1) {
        if(n == 1 && m == 1) cout << 0 << endl;
        else cout << 1 << endl;
        return ;
    }else 
    cout << ls+1 << endl;
    return ;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}