前言:
本场校赛的题解按难度来排序。先按照过题人数多的题来更新题解。
题目以思维题居多,但是没想到大家的语法基础比较差。
赛后补题才能更好的提高自己的水平,补题的链接也包含在下面的标题中了,大家点进去补题就好。
homo VS Jesse
题意:
t组数据,输入t行字符串,对于每个字符串,判断里面‘J’的数量和‘H’的数量,输出相应的答案。
做法:
使用scanf读入字符串,然后用strlen函数求出字符串的长度,就可以遍历这个字符串了。
#include <bits/stdc++.h>
char s[100];
void solve()
{
scanf("%s", s + 1);
int n = strlen(s + 1);
int H = 0, J = 0;
for (int i = 1; i <= n; i++)
{
if (s[i] == 'H') H++;
if (s[i] == 'J') J++;
if (H == 3)
{
printf("Sleep~\n");
return;
}
if(J == 3)
{
printf("Practise!\n");
return;
}
}
}
int main()
{
int tt = 1;
scanf("%d", &tt);
while (tt--) solve();
return 0;
}
homo’s mini train
做法:
从1到n,一直求最小值,然后输出就可以了。
#include <bits/stdc++.h>
void solve()
{
int n;
scanf("%d", &n);
int mi = 1e9;
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
if (x < mi) mi = x;
printf("%d ", mi);
}
printf("\n");
}
int main()
{
int tt = 1;
scanf("%d", &tt);
while (tt--) solve();
return 0;
}
play chess with homo
做法:
显然,最终每一行,每一列都不会有多于3及3个以上个炮,否则,他们一定会产生攻击。
所以答案的最大也就是4。所有的答案无非就是1,2,4这三个数。
特判行和列是不是为1的情况,其他的情况输出4即可。
这种题就是ACM圈子里经常提到的“思维题”。
#include <stdio.h>
void solve()
{
int a, b;
scanf("%d%d",&a,&b);
if (a > 2) a = 2;
if (b > 2) b = 2;
printf("%d\n", a * b);
}
int main()
{
int tt = 1;
scanf("%d", &tt);
while (tt--) solve();
return 0;
}
Sign in here!
做法:
对于问题一,特判a = 1的情况,此时问题无解。
对于a > 1,只要模拟这个式子就好,可以证明相乘的次数不会太多,因为这是个指数级增长的式子。
对于问题二,相信大家的C语音课程会有求最大公约数的练习题,此处就不展开详细的说明。
#include <bits/stdc++.h>
int _1(int a, int b)
{
if (a == 1) return 0;
int ret = 0;
int k = 1;
while(k * a <= b)
{
ret++;
k *= a;
}
return ret;
}
int _2(int a, int b) {return std::__gcd(a, b);}
void solve()
{
int a, b;
scanf("%d%d",&a,&b);
printf("%d\n", (_1(a, b) ^ _2(a, b)));
}
signed main()
{
int tt = 1;
scanf("%d", &tt);
while (tt--) solve();
return 0;
}
Jesse VS Yaozi
做法:
对于每一局,数组中数的个数是 2 * n,先手可以取的位置是1或者2 * n,即先手可以拿到奇数位置的数或者偶数位置的数。
先说结论,先手一定可以拿到所有的奇数下标的数,或者偶数下标的数。
证明很简单,假设先手想要奇数位置的数,那他先拿走位置1的数,这时候后手只能选偶数位置的数了,以此类推,先手可以拿到所有的奇数位置的数。
偶数位置的同理。
下面的代码使用了c++语法,大家只需要关心solve函数中的逻辑即可,不用关心怎么输入输出。
#include <bits/stdc++.h>
#define endl "\n"
#define i128 __int128
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define lowbit(x) ((x) & (-x))
#define popcount(x) __builtin_popcount(x)
#define all(x) x.begin() ,x.end()
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while(t--)
{
int n, f;
cin >> n >> f;
n <<= 1;
ll a = 0, b = 0;
for(int i = 0; i < n; i++)
{
int x;
cin >> x;
if(i & 1) a += x;
else b += x;
}
if(a == b) cout << "Pingju" << endl;
else if(f) cout << "Jesse" << endl;
else cout << "Yaozi" << endl;
}
return 0;
}
0 and 1 (easy version)
做法:
-
对于easy version,直接遍历l ~ r这个区间,计算其中的数到0的距离更小,还是到k的距离更小即可。然后累加输出答案。
-
对于hard version,需要用到离散化和树状数组,这里说一下大致思路,将询问离线后,树状数组离线求出区间第k小的位置,接着再用树状数组快速求和即可。
注意输出的数,有可能会超过int的范围,所以要使用long long,赛中wa的十几分代码,大概都是这个原因。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5, mod = 1e9 + 7;
int a[N];
void solve()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++){
int l, r, k;
cin >> l >> r >> k;
int ans = 0;
for (int j = l; j <= r; j++){
ans += min(a[j], k - a[j]);
}
cout << ans << "\n";
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt = 1;
// cin >> tt;
while (tt--) solve();
return 0;
}
如果对hard version 版本的代码感兴趣,可以私聊出题人要,这里就不放了。
homo’s CCPC medal
做法:
四层暴力循环,输入的时候,标记一下哪些数是不能使用的。在四层循环内,如果遇见了不能使用的数,那就continue。然后使用map统计,或者数组统计数字出现过的次数就可以了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5, mod = 1e9 + 7;
void solve()
{
int n;
cin >> n;
vector<int> f(10);
for (int i = 1; i <= n; i++)
{
// cin >> a[i];
int x;
cin >> x;
f[x] = 1;
}
int cnt = 0;
for (int i = 0; i < 10; i++)
{
if (f[i]) continue;
for (int j = 0; j < 10; j++)
{
if (f[j]) continue;
for (int k = 0; k < 10; k++)
{
if (f[k]) continue;
for (int l = 0; l < 10; l++)
{
if (f[l]) continue;
map<int, int> mp;
mp[i]++;
mp[j]++;
mp[k]++;
mp[l]++;
if (mp.size() == 2 && (*mp.begin()).second == (*mp.rbegin()).second) cnt++;
}
}
}
}
cout << cnt << "\n";
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int tt = 1;
cin >> tt;
while (tt--) solve();
return 0;
}
垚子垚子垚子垚子翻翻我
腰子学长可爱捏OvO
学长我今天下午一点都不会写🥺🥺🥺
加油!慢慢变强
写的不错~