武汉高校联合程序设计新生赛
- [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();
}
}