A、坤星球
签到题
#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);
cout << 2024 * 2.5 << endl;
return 0;
}
B、 二进制王国
两个字符串a,b按字典序排序,判断a+b和b+a的关系即可,自定义一个bool类型的cmp函数,然后return a+b<b+a 。使用sort()函数对字符串进行排序。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N = 2e5 + 10;
string s[N];
bool cmp(string a, string b) {
return a + b < b + a;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> s[i];
sort(s + 1, s + n + 1, cmp);
for (int i = 1; i <= n; i++) cout << s[i];
return 0;
}
C、 djwcb
找规律。我们依次枚举0~9每个数的n次幂,会发现每个数的n次幂的个位数都有以4个为一周期的规律。首先我们将x%=10(因为其实只要看个位数的变化就行)。同时因为题目中的p很大,我们用字符串存p。遍历字符串p将字符串p转成整数同时%4,用res记录结果。如果最后res=0,说明正好整除,我们就让res=4。最后按照题意求pow(x,res)%10即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
void solve(){
int x; string p;
cin>>x>>p;
x%=10;
int res=0;
for(int i=0;i<p.size();i++){
res=(res*10+p[i]-'0')%4;
}
if(res==0) res=4;
int ans=pow(x,res);
cout<<ans%10<<endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin>>t;
while(t--){
solve();
}
return 0;
}
D、 求解线性方程组
找规律,通过递推找出关系式x[i]=a[i-1]-x[i-1]-x[i-2]。因为xi只能为0或1,所以我们让x1=0或x1=1分类讨论这两种情况即可。因为要求字典序最小的解,我们先讨论x[1]=0的情况,如果通过递推其中某个x[i]不为0且x[i]不为1,说明x1=0的方案不可行,而题目又保证线性方程组至少存在一组解且合法,那么说明此时x1=1的方案可行。最后输出满足题意的那一种方案即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const int N=2e5+10;
int n,a[N],x[N],y[N];
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
x[1]=0;
int f=0;
for(int i=2;i<=n;i++){
x[i]=a[i-1]-x[i-1]-x[i-2];
if(x[i]!=0&&x[i]!=1){
f=1;
break;
}
}
y[1]=1;
for(int i=2;i<=n;i++){
y[i]=a[i-1]-y[i-1]-y[i-2];
}
if(!f){
for(int i=1;i<=n;i++) cout<<x[i]<<" ";
cout<<endl;
}else{
for(int i=1;i<=n;i++) cout<<y[i]<<" ";
cout<<endl;
}
return 0;
}
E、 美丽圆环
给定两个操作,操作1是让数组上的任意数字更改为任意整数,操作2交换数组上任意两个数的位置。题意是让一个数ai左右两侧的数其中一个大于等于ai,另一个小于等于ai。求操作1的最小次数。
首先我们对原数组进行排序。此时除了,首尾两个数,其余数都满足其左右两侧数一个数大于等于ai,另一个数小于等于ai。
我们再进行分类讨论(这里数组下标为1~n,ans表示操作1的次数):
1、如果数组长度n为2,那么如果a1=a2,不需要进行操作,ans=0;否则a1!=a2,需要进行一次操作让a1=a2,ans=1。
2、n>2的情况,因为已经排序了。如果a1!=a2(此时a1<a2,a1<a[n],需要将a1变成a[n]才符合题意,此时操作数ans++),如果a[n-1]!=a[n](此时a[n-1]<a[n],a1<a[n],需要将a[n]变成a[n-1]才符合题意,此时操作数ans++)。需要注意的是,如果a2=a3或者a[n-2]=a[n-1],只需要改变a1,用操作2交换位置即可(如1 2 2 4 5 变成 5 2 2 4 5),此时令ans=1。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
void solve(){
int n; cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
sort(a.begin()+1,a.end());
int ans=0;
if(n==2){
if(a[1]!=a[2]) ans=1;
}else{
if(a[1]!=a[2]) ans++;
if(a[n-1]!=a[n]) ans++;
if(ans==2){
if(a[2]==a[3]||a[n-2]==a[n-1]) ans=1;
}
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t; cin>>t;
while(t--){
solve();
}
return 0;
}
F、小蓝的跳跃
dp(很经典的跳格子问题的变式)。记录到最后一个点的最小值和最大值,如果x在这个区间内就是可以调整(如果比x小了,就多走一些+1,少走一些-1;如果比x大了,多走一些-1,少走一些+1),可以到达x。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
void solve(){
int n,x; cin>>n>>x;
vector<int> a(n+5);
for(int i=1;i<=n;i++) cin>>a[i];
vector<int> b(n+5),c(n+5);
b[1]=c[1]=a[1];
for(int i=2;i<=n+1;i++){
b[i]=min(b[i-1],b[i-2])+a[i];
c[i]=max(c[i-1],c[i-2])+a[i];
}
if(x>=b[n+1]&&x<=c[n+1]) cout<<"Yes"<<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;
}