2024级HAUT新生周赛(一)题解
A:我爱编程,编程使我快乐。
签到,直接输出就行
#include <stdio.h>
int main()
{
printf("我爱编程,编程使我快乐。");
}
B: 我要看奥运!!!
注意时间跨天以及scanf和printf的使用
#include <bits/stdc++.h>
using namespace std;
signed main()
{
int hh,mm;
scanf("%d:%d",&hh,&mm);
hh = hh + 18;
hh %= 24;
printf("%02d:%02d",hh,mm);
}
C: 二进制翻转
根据题意只需要计算数组中连续的0的段数即是答案,注意到每个连续的0的段前面必定有一个1(如果起始为0单独计算),所以记录前1后0的位置的数量即是连续的0的段的数量。
#include <stdio.h>
int n;
int a[200005];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
int ans = 0;
if (a[0] == 0) ans++;
for (int i = 1; i < n; i++) {
if (a[i] == 0 && a[i - 1] == 1) ans++;
}
printf("%d\n", ans);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n;
int a[200005];
int main() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
int ans = 0;
if (a[0] == 0) ans++;
for (int i = 1; i < n; i++) {
if (a[i] == 0 && a[i - 1] == 1) ans++;
}
cout << ans << endl;
return 0;
}
D: 小明的数字
先用char数组读入字符串s,再遍历判断s中的每一个字符,从第一个字符开始,当第i个字符比m小时,将m插入到第i个字符前面,就可以保证最后得到的值是最大值。
#include <stdio.h>
char s[105];
int main()
{
int n;
char m;
scanf("%d", &n);
scanf("%s %c", s, &m);
int f = 0;
for (int i = 0; i < n; i++)
{
if (m > s[i] && f == 0)
{
printf("%c", m);
f = 1;
}
printf("%c", s[i]);
}
if (f == 0)
printf("%c", m);
return 0;
}
E:小明的打怪游戏
由于先攻击血量高的怪物,所以在读取时可以先对血量ai大于k的值对k取模。取模后这个题就变成了一个排序问题,将血量高的排在前面,因为优先攻击血量高的怪物,血量相同时,按找下标排序,将下表较小的放在前面。就可以得到怪物死亡顺序了。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct xp
{
int i, k;
} a[N];
bool cmp(xp a, xp b)
{
if (a.k != b.k)
{
return a.k > b.k;
}
return a.i < b.i;
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
a[i].i = i;
cin >> a[i].k;
if (a[i].k % k == 0)
a[i].k = k;
else
a[i].k %= k;
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
cout << a[i].i << ' ';
}
return 0;
}
F: 寝室的宝箱(简单版)
简单的加减计算,对于输入的数字和字符调用相关的式子即可
#include<stdio.h>
int main()
{
int x,y;
char ch;
scanf("%d %c %d",&x,&ch,&y);
printf("%d",(ch=='+'?x+y:x-y));
return 0;
}
G: 寝室的宝箱(困难版)
如果选择整形进行计算需要考虑使用longlong,对于除法需要特判一下,另外使用浮点数进行计算由于没有卡精度所以也是可以过的。
#include<stdio.h>
int main()
{
long long x,y;
char ch;
scanf("%lld %c %lld",&x,&ch,&y);
if(ch=='/')
{
if(x%y)printf("%.2lf",(double)x/y);
else printf("%lld",x/y);
}
else printf("%lld",ch=='+'?x+y:(ch=='-'?x-y:x*y));
return 0;
}
H:小明的午餐难题
找到a,b,c,d中的最小值,并将其输出。
#include <stdio.h>
int main()
{
int a, b, c, d;
scanf("%d %d %d %d", &a, &b, &c, &d);
int minnum = a;
if (minnum > a)
minnum = a;
if (minnum > b)
minnum = b;
if (minnum > c)
minnum = c;
if (minnum > d)
minnum = d;
printf("%d", minnum);
return 0;
}
I:历经千辛万苦,只为得到你
签到题,直接输出即可。
#include<stdio.h>
int main()
{
printf("AC!!!\n");
return 0;
}
J: 元素中和之力
观察发现草或风只有一种中和反应方法,所以从草或风开始依次计算即可 反应时取反应元素中较小的元素值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve()
{
ll x[8] = {0};
int t;
cin >> t;
while (t--)
{
for (int i = 1; i <= 7; ++i)
{
cin >> x[i];
}
ll ans = 0;
swap(x[4], x[7]); // 交换
for (int i = 7; i >= 1; --i)
{
ll mi = min(x[i], x[i - 1]);
if (mi > 0)
{
ans += mi;
x[i - 1] -= mi;
}
}
cout << ans << "\n";
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int test = 1;
// cin >> test;
while (test--)
{
solve();
}
return 0;
}