🤗🤗🤗🤗🤗🤗🤗,今天也是麻麻的一天捏
🤗
A、组队(5分)
一眼看出,有点水
#include<iostream>
using namespace std;
int main()
{
cout<<98 + 99 + 98 + 97 + 98 << endl;
return 0;
}
// 490
B、年号字串(5分)
有一点水,原来是指测试数据水,我这样写连Z都判不出来,但是还是能过捏🤗🤗
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 500;
int a[N];
int main()
{
int num = 2019;
int cnt = 0;
while(num)
{
a[cnt++] = num % 26;
num /= 26;
}
reverse(a,a + cnt);
for(int i = 0 ; i < cnt ; i++)
if(a[i] == 0) printf("Z");
else printf("%c",a[i] + 'A' - 1);
return 0;
}
C、 数列求值(10分)
暴力不动了,我们只考虑后四位
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
int n = 20190324;
int a = 1 ,b = 1 ,c = 1 , d = 0;
for(int i = 4 ; i <= n ; i++)
{
d = (a + b + c) % 10000;
a = b;
b = c;
c = d;
}
cout<<d<<endl;
return 0;
}
D、数的分解(10分)
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n = 2019;
int res = 0;
for(int i = 1 ; i <= n ; i++)
for(int j = i + 1 ; j < n ; j++)
{
int k = n - i - j;
string a = to_string(i);
string b = to_string(j);
string c = to_string(k);
if(a.find("2") == -1 && a.find("4") == -1
&& b.find("2") == -1 && b.find("4") == -1
&& c.find("2") == -1 && c.find("4") == -1 )
if(j < k)
res++;
}
cout<<res<<endl;
return 0;
}
E、迷宫(15分)
01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000
F、特别数的和(15分)
【输入样例】
40
【输出样例】
574
【数据范围】
对于 20% 的评测用例 : 1 ≤ n ≤ 10 {1 \le n \le 10} 1≤n≤10
对于 50% 的评测用例 : 1 ≤ n ≤ 100 {1 \le n \le 100} 1≤n≤100
对于 80% 的评测用例 : 1 ≤ n ≤ 1000 {1 \le n \le 1000} 1≤n≤1000
对于所有的评测用例 : 1 ≤ n ≤ 10000 {1 \le n \le 10000} 1≤n≤10000
语法基础题,不做评价
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
int n;
cin>>n;
LL res = 0;
for(int i = 1 ; i <= n ; i++)
{
string a = to_string(i);
if(a.find("2") != -1 || a.find("0") != -1 || a.find("1") != -1 || a.find("9") != -1)
res += i;
}
cout<<res<<endl;
return 0;
}
G、完全二叉树的权值(20分)
输出一个整数代表答案
【输入样例】
7
1 6 5 4 3 2 1
【输出样例】
2
【数据范围】
对于所有的评测用例 : 1 ≤ N ≤ 100000 {1 \le N \le 100000} 1≤N≤100000 , − 100000 ≤ A i ≤ 100000 {-100000\le A_i \le 100000} −100000≤Ai≤100000
我们不难发现,完全二叉树的层数和节点,都是2的倍数
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int main()
{
int n;
cin>>n;
int maxSum = -1e7;
int res = 0;
for(int i = 1 ; i <= n ; i++) cin>>a[i];
for(int i = 1 ; 1 << (i - 1) < n ; i++)
{
int t = 0; // 用于记录这一层各个节点的和
for(int j = 1 << (i - 1) ; j < (1 << i) && j < n ; j++)
t += a[j];
if(t > maxSum)
{
maxSum = t;
res = i;
}
}
cout<<res<<endl;
return 0;
}
H、等差数列(20分)
【输入样例】
5
2 6 4 10 20
【输出样例】
10
【样例说明】
包含2、6、4、10、20的最短等差数列是 2、4、6、8、10、12、14、16、18、20
【数据范围】
对于所有评测用例, 2 ≤ N ≤ 100000 {2 \le N \le 100000} 2≤N≤100000, 0 ≤ A i ≤ 1 0 9 {0 \le A_i \le 10^9} 0≤Ai≤109
相邻的两个数,必然是公差的倍数
求等差数列的个数: a 末 − a 首 b + 1 { \frac{a_末 - a_首}{b}} + 1 ba末−a首+1
每一项与第一项的差一定是d的倍数
#include <iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
int gcd(int a,int b)
{
return b ? gcd(b , a % b) : a;
}
int main()
{
cin >> n;
for(int i = 0 ; i < n ; i++) cin >> a[i];
sort(a, a + n);
int d = 0;
for(int i = 1 ; i < n ; i++) d = gcd(d,a[i] - a[0]);
if(d == 0) cout << n << endl;
else cout << (a[n-1] - a[0]) / d + 1 << endl;
return 0;
}
I、 后缀表达式(25分)
【输入样例】
1 1
1 2 3
【输出样例】
4
【数据范围】
0 ≤ N , M ≤ 100000 {0 \le N,M \le 100000} 0≤N,M≤100000, − 1 0 9 ≤ A i ≤ 1 0 9 {-10^9 \le A_i \le 10^9} −109≤Ai≤109
开摆1下🤗
J、灵能传动(25分)
【输入样例】
【输出样例】
【数据范围】
开摆1下🤗
每日小练
1、排它平方数
这题给我玩阴滴嗷,我就说long long
都给你爆爆了?????,原来是int * int
的结果是int
,所以我们要在*
之前先强转long long
#include <iostream>
#include<cstring>
using namespace std;
typedef long long LL;
bool st[20];
int main()
{
for(int i = 123456 ; i < 1000000 ; i++)
{
if(i == 203879) continue;
memset(st,false,sizeof st);
bool flag = false;
string as = to_string(i);
for(int i = 0 ; i < as.size() ; i++)
{
if(st[as[i] - '0'])
{
flag = true;
break;
}
st[as[i] - '0'] = true;
}
if(flag) continue;
LL b = (LL)i * i; // 细节(LL)
string bs = to_string(b);
for(int i = 0 ; i < bs.size() ; i++)
if(st[bs[i] - '0'])
{
flag = true;
break;
}
if(!flag)
{
cout<<i<<endl;
break;
}
}
return 0;
}
2、买不到的数目
【输入输出样例】
【示例】
输入
4 7
输出
17
运行限制
- 最大运行时间:3s
- 最大运行内存: 64M
规律题,可以当结论,两个数(a和b)一定取不到的数是(a-1)*(b-1)
#include <iostream>
using namespace std;
int main()
{
int a , b;
cin >> a >> b;
cout<< a * b - a - b << endl;
return 0;
}
3、回文日期
模拟题,没有什么好🔒的了
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int mouths[] = {31,28,31,30,31,30,31,31,30,31,30,31};
bool isValid(int year,int mouth,int day)
{
if(mouth > 12 || mouth < 0) return false;
if(mouth != 2)
{
if(mouths[mouth-1] < day)
return false;
}
else
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if(mouths[mouth-1] + leap < day)
return false;
}
return true;
}
int main()
{
string date;
cin>>date;
int year = 0;
for(int i = 0 ; i < 4 ; i++)
year = year * 10 + (date[i] - '0');
int dateMouth = ( date[4] - '0' ) * 10 + (date[5] - '0');
int dateDay = ( date[6] - '0' ) * 10 + (date[7] - '0');
for(int i = year ; ; i++) // 用i代替年来枚举
{
int mouth = i % 10 * 10 + i / 10 % 10 ;
int day = i / 100 % 10 * 10 + i / 1000;
if(i == year && mouth <= dateMouth && day <= dateMouth) continue;
if(isValid(i, mouth , day ))
{
cout<<i * 10000 + mouth * 100 + day<<endl;
break;
}
}
// 枚举回文字年
int ab = (date[0] - '0') * 10 + (date[1] - '0');
int mm = (date[4] - '0') * 10 + (date[5] - '0');
int abxx = ab * 100 + (date[2] - '0') * 10 + (date[3] - '0');
for(int i = ab ; ; i++)
{
int a = i / 10;
int b = i % 10;
int newYear = a * 1000 + b * 100 + a * 10 + b;
int newMouth = b * 10 + a;
if(abxx > newYear) continue; // 年月日比较,枚举的必须比它大
if(abxx == newYear && mm >= newMouth) continue;
if(isValid(newYear, newMouth, newMouth))
{
printf("%d%02d%02d\n",newYear,newMouth,newMouth);
break;
}
}
return 0;
}
4、约瑟夫环
开摆🤗🤗🤗🤗 ,真不懂
#include <iostream>
using namespace std;
int main()
{
int n,k;
cin >> n >> k;
int j = 0;
for(int i = 1 ; i <= n ; i++)
j = (j + k) % i;
j++;
cout << j << endl;
return 0;
}
🤗🤗🤗🤗,美好的一天从被麻麻结束