原题链接:第 6 场 小白入门赛 - 蓝桥云课
目录
A、元宵节快乐
B、猜灯谜
C、数学奇才
D、你不干?有的是帕鲁干!
E、等腰三角形
F、 计算方程
A、元宵节快乐
签到题
print("Today AK!")
B、猜灯谜
模拟,特判下数组首尾的情况即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n;
vector<ll> a(n + 10);
for (int i = 1; i <= n; i++) cin >> a[i];
vector<ll> b;
for (int i = 1; i <= n; i++) {
if (i == 1) b.push_back(a[2] + a[n]);
else if (i == n) b.push_back(a[n - 1] + a[1]);
else b.push_back(a[i - 1] + a[i + 1]);
}
for (auto i : b) cout << i << " ";
cout << endl;
return 0;
}
C、数学奇才
操作n次,每个数都会变成正数。直接取绝对值累加即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 1e5 + 10;
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n;
vector<ll> a(n);
ll sum=0;
for (int i = 0; i < n; i++) {
cin >> a[i];
sum+=abs(a[i]);
}
cout<<sum<<endl;
return 0;
}
D、你不干?有的是帕鲁干!
找规律 ,需要的数学知识——平方差公式 a^2-b^2 = (a+b)*(a-b)
我们可以 手动 依次枚举 两个连续正奇数的平方之差 打表 来找规律:
3^2-1^2 = 8 = (3 + 1)*(3 - 1) = 4 * 2
5^2-3^2 = 16 = (5 + 3)*(5 - 3) =8 * 2
7^2-5^2 = 24 = (7 + 5)*(7 - 5) =12 * 2
9^2-7^2 = 32 = (9 + 7)*(9 - 7) =16 * 2
11^2-9^2 = 40 =(11 + 9)*(11 - 9) =20 * 2
我们可以发现,一个数 x 如果能被表示成 两个连续正奇数 a和 b 的平方之差,这个数 x 必然是8的倍数。
同时,根据平方差公式,x 可以表示成两个数 a 和 b 的乘积。
根据上面的推导过程 每一列最后一个等号 后面的式子,我们可以知道 a+b=x/2,a-b=2。 联立这个二元一次方程组(x是题目给的,相当于是已知的)即可求出 a=x/4+1,b=x/4-1。
最后需要注意题目中x的范围大于等于0,所以我们需要特判 x==0的情况,直接输出“No”即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
void solve() {
ll x; cin >> x;
if(x==0){
cout<<"No"<<endl;
return;
}
if (x % 8 == 0) {
cout << "Yes" << endl;
ll a = x / 2, b = 2;
cout << x / 4 - 1 << " " << x / 4 + 1 << endl;
}
else cout << "No" << endl;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}
E、等腰三角形
贪心+双指针,需要的数学知识:三角形两边之和大于第三边。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n; cin>>n;
vector<ll> a(n),b(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a.begin(),a.end());
sort(b.begin(),b.end());
ll ans=0;
for(int i=0,j=0;i<n;i++){
if(a[i]*2>b[j]){
j++;
ans++;
}
}
cout<<ans<<endl;
return 0;
}
F、 计算方程
二分答案。套二分的模板找左边界即可(不知道模板的可以参考这篇博客https://blog.csdn.net/m0_62531913/article/details/134633501?spm=1001.2014.3001.5501)。
需要用到的数学知识——换底公式
需要用到的库函数 向下取整函数floor()
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n; cin>>n;
vector<ll> a(n),b(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
sort(a.begin(),a.end());
sort(b.begin(),b.end());
ll ans=0;
for(int i=0,j=0;i<n;i++){
if(a[i]*2>b[j]){
j++;
ans++;
}
}
cout<<ans<<endl;
return 0;
}