非官方题解|ACGO五一欢乐赛#20题解
2024-05-07 21:38:34
发布于:浙江
评价一下,真的挺简单的,(后来看了下,除了T10是普及-,别的全红题)就是long long的重要性很明显啊
注:以下代码都是比赛时自写,如有雷同,纯属巧合
T1:* + B + C
要讲吗?直接上代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int *,b,c;
scanf("%d%d%d",&*,&b,&c);
printf("%d",*+b+c);//用格式化输入可以尽量快点
return 0;
}//本题运行耗时:3ms
T2:2的N次方
注意看数据量,n就可以到60,但LL只能到2的32次方,故要用高精(很容易发现吧)
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m = 1, *[10086] = {1};//注意1和任何数相乘都得原数
cin >> n;
for (int i = 0; i < n; ++i) {
int t = 0;
for (int j = 0; j < m; ++j) {
t += *[j] * 2;//进行乘二
*[j] = t % 10;//留下剩余
t /= 10;
}
if (t) *[m++] = 1;//进行进位
}
for (int i = m - 1; i >= 0; --i) cout << *[i];//最后倒序输出
return 0;
}//本题运行耗时5ms
T3:下一个字母
我应该是用的比较朴实的方法,加ascii码,z或*做个特判
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {
string *;
cin >> *;
for (int i = 0; i < *.size(); i++) {
if (*[i] < 'z' && *[i] >= '*')cout << char(*[i] + 1);//小写字母移动
else if (*[i] == 'z')cout << '*';//小写z特判
else if (*[i] < 'Z' && a[i] >= 'A')cout << char(a[i] + 1);//小写字母移动
else if (a[i] == 'Z')cout << 'A';//大写Z特判
else cout<<a[i];
}
return 0;
}//本题运行耗时:4ms
#include <bits/stdc++.h>
using namespace std;
int main() {
char s[200];
int len, i;
cin>>s;
len = strlen(s) % 3;//计算哪里要逗号分隔
for (i = 0; s[i] != '\0'; i++) {//到换行时截止
printf("%c", s[i]);
if ((i + 1) % 3 == len && s[i + 1] != '\0')printf(",");//三位一个逗号,如果临近末尾就不用了
}
return 0;
}//本题运行耗时:9ms
T5:画个ACGO
卡了我最长的时间好吗?!这入门???最后我用了个黑科技再改了一会儿才AC的
#include<iostream>
using namespace std;
int main() {
cout << R"( ___ ______ _______ ______
/ \ / | / _____| / __ \
/ ^ \ | ,----'| | __ | | | |
/ /_\ \ | | | | |_ | | | | |
/ _____ \ | `----.| |__| | | `--' |
/__/ \__\ \______| \______| \______/)";
}//本题运行耗时:0ms(真的,就有点离谱......)
看完后估计很多人都懵了,当时的我也是如此啊。真的纯纯黑科技!!!叫原始字符串字面值(raw string literal),我是在洛谷做超级玛丽的时候看到的 原题解传送门
在c++11被加入,格式如下:R"(原始字符串)";
这道题我真的,注意用这个记得注意格式,我就因为最后一行和后括号分行了,导致多了一个空行,PE了12次
T6:音乐播放器
就暴力模拟加减呗,估计也有大犇会一些神仙写法,但本蒟蒻就模拟了一遍,再加俩特判就AC了
代码如下:
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}//判断正负
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3)/*用位运算实现乘10*/ + (ch ^ 48)/*用异或加速,同ch-'0'*/;
ch = getchar();
}
return x * f;
}//快读模板,后面还要见,原理在于读入字符比读入数字快
int main() {
int n, m, k;
n = read(), m = read(), k = read();
while (m--) {
string s;
cin >> s;
if (s == "->") {
if (++k > n)k = 1;//++k先自加再判断,可以减少代码量,此处意为歌曲序号先向后加1,接着判断是否超过了n,即播放到底,回到第一首
} else {
if (--k < 1)k = n;//同理
}
}
cout << k << endl;
return 0;
}//本体运行用时:7ms
T7:10的N次方
10的正整数次方什么特点?几次方就几个0,直接输出一个1加n个0就行了
代码如下:
#include<iostream>
using namespace std;
int main() {
int n;
scanf("%d",&n);
printf("1");
while(n--)printf("0");//需要解释吗?就是输出n个0
return 0;
}//本题耗时7ms(极其不满意)
T8:日期间隔计算
这题应该有多种写法,我用的是将两个天数都算出来,进行相减,挺好理解的:
#include<bits/stdc++.h
using namespace std;
int year1, year2, month1, month2, day1, day2;
long long a, b;//统计天数
int yue[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//月份天数表
int main() {
scanf("%d-%d-%d", &year1, &month1, &day1);
scanf("%d-%d-%d", &year2, &month2, &day2);//我输入搞了半天,先用cin,后用字符串,突然发现,可以格式化输入
a = year1 * 365 + (year1 - 1) / 4/*四年一闰*/ - (year1 - 1) / 100/*百年不闰*/ + (year1 - 1) / 400/*四百年再闰*/;
if (year1 % 4 == 0 && year1 % 100 != 0 || year1 % 400 == 0) yue[2] = 29;//闰年2月29天
for (int i = 1; i < month1; i++)
a += yue[i];//加上月份的日子,注意最后一个月不算
a += day1;//加上最后一个月过了的日子
b = year2 * 365 + (year2 - 1) / 4 - (year2 - 1) / 100 + (year2 - 1) / 400;
if (year2 % 4 == 0 && year2 % 100 != 0 || year2 % 400 == 0) yue[2] = 29;
else yue[2] = 28;//这里else是用于防止前面改过29,要改回来
for (int i = 1; i < month2; i++)
b += yue[i];
b += day2;
printf("%d",abs(a-b));//记得加abs取绝对值
return 0;
}//本题耗时10ms(不满)
T9:ZXC的闯关计划
很简单的虽然我dfsT了9个点才知道回改,就是要记得开LL啊
#include<bits/stdc++.h>
using namespace std;
long long n, m, a[1005];//十年OI一场空,不开LL见祖宗!!!
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}//这里read只能读int的数,但其实也可以放这儿,因为输入数据是小于int的
void func() {
for (int i = 1; i <= n; ++i) {
m -=a[i];
if (m <= 0)break;//一旦血没了就结束
else m += floor(m / 50);//floor向下取整,虽然不加应该也能过
}
if (m >= 1)cout << m << endl;
else cout << -1 << endl;
}
int main() {
n=read(),m=read();
for (int i = 1; i <= n; ++i)a[i]=read();
sort(a + 1, a + n + 1);//先排序,之后好贪心
func();
return 0;
}
T10:2024的倍数
本题源代码赛时没存下来,此个为新写的
思路的话,我最开始也想偏了,用map几乎没对,后面改成了取模桶标进行技术优化
代码如下:
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x;
}//快读又见面了啊
long long n, ans = 0, tmp,a[2025];//记得开longlong我这儿放一起开了
int main() {
n = read();
while (n--) {
tmp = read();
if (a[tmp % 2024] >= 1)
ans += a[tmp %2024];//一旦不止1个数,就可以加了
++a[tmp % 2024];//进行累加
}
printf("%lld",ans);
return 0;
}
正文结束......
广告:
三体组织ACGO分部日常招聘,欢迎来到三体组织ACGO分部,迎接主的降临传送门
全部评论 6
《及其不满意》
2024-05-10 来自 广东
0没人吗?顶
2024-05-09 来自 浙江
0顶
2024-05-08 来自 浙江
0顶
2024-05-07 来自 浙江
0顶
2024-05-07 来自 浙江
0顶
2024-05-07 来自 浙江
0
有帮助,赞一个