sd20251009训练赛补题
文章目录
- 前言
- 虽然这些题在cf上是1200-1300难度,但是感觉又不像这个难度区间的题
- 1. A - Sasha and Magnetic Machines
- 2. B - Postcard
- 3. D - Vitamins
- 4. E - Polycarp's Practice
- 5. F - Three Parts of the Array
- 6. H - Two Cakes
前言
虽然这些题在cf上是1200-1300难度,但是感觉又不像这个难度区间的题
1. A - Sasha and Magnetic Machines
题意就是两个数进行操作,使得总功率最小,要求能够被x整除,很显然为了最小,所以j就是最小的那个数,而对于被除数,因为数据范围较小,我们只需要遍历数组中的数,并遍历每一个数能够除尽的数即x,遍历过程中求最小就行了
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
const int N=5e4+6;
int a[N];
signed main()
{int n;cin>>n;int sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];//提前计算总数,方便后面计算总功率}sort(a+1,a+n+1);int x=INT_MAX;for(int i=2;i<=n;i++){for(int j=1;j<=a[i];j++){int c=sum;if(a[i]%j==0&&a[i]>=j*a[1])//由选择的两个数之间的关系推出{c-=a[i]-a[i]/j-(j-1)*a[1];x=min(x,c);}}}cout<<x;return 0;
}
2. B - Postcard
这题题意很明显,分三种情况,1.字母数与k相同 2.小于 3.大于
这里写的代码感觉很繁杂,如果不细心分析可能会出错
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<char,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
signed main()
{string s;cin>>s;int k;cin>>k;int sum=0;int sum1=0;int x=-1;vector<pii>ve;for(int i=0;i<s.size();i++){if(s[i]=='*')x=i;if(s[i]>=97&&s[i]<=122)ve.push_back({s[i],i});elsesum1++;}if(ve.size()==k)//等于{for(int i=0;i<ve.size();i++){cout<<ve[i].fi;}}else if(ve.size()<k)//小于{int y=k-ve.size();int z;if(x>0){for(int i=0;i<ve.size();i++){if(ve[i].se<x)z=ve[i].se;}for(int i=0;i<ve.size();i++){if(ve[i].se!=z)cout<<ve[i].fi;else{for(int j=1;j<=y+1;j++)cout<<ve[i].fi;}}}elsecout<<"Impossible";}else//大于{int y=ve.size()-k;if(sum1<y)cout<<"Impossible";else{int z=0;for(int i=0;i<ve.size();i++){if(ve[i].se+1!=ve[i+1].se&&ve[i].se<s.size()-1&&z<y)//要考虑最后一个字母是否是字符串会后一个,不然会越界{z++;}elsecout<<ve[i].fi;}} }return 0;
}
3. D - Vitamins
这题考虑A B C AB AC BC ABC 三种情况就行了,代码感觉依旧是很麻烦
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
const int N=1e5+6;
signed main()
{int n;cin>>n;int a[7];int sum=INT_MAX;for(int i=1;i<=6;i++)a[i]=N;for(int i=1;i<=n;i++){int x;cin>>x;string s;cin>>s;if(s.size()==1){if(s=="A")a[1]=min(a[1],x);if(s=="B")a[2]=min(a[2],x);if(s=="C")a[3]=min(a[3],x);}else if(s.size()==2){if(s=="AB"||s=="BA")a[4]=min(a[4],x);if(s=="BC"||s=="CB")a[5]=min(a[5],x);if(s=="AC"||s=="CA")a[6]=min(a[6],x);}elsesum=min(sum,x);}if(a[1]!=N&&a[3]!=N&&a[2]!=N)sum=min(sum,a[1]+a[2]+a[3]);if(a[4]!=N&&a[3]!=N)sum=min(sum,a[3]+a[4]);if(a[4]!=N&&a[5]!=N)sum=min(sum,a[5]+a[4]);if(a[4]!=N&&a[6]!=N)sum=min(sum,a[6]+a[4]);if(a[5]!=N&&a[1]!=N)sum=min(sum,a[1]+a[5]);if(a[5]!=N&&a[6]!=N)sum=min(sum,a[6]+a[5]);if(a[2]!=N&&a[6]!=N)sum=min(sum,a[2]+a[6]);if(sum==INT_MAX)cout<<"-1";else cout<<sum;
}
4. E - Polycarp’s Practice
这题仔细想想就知道选几个最大的数就行了,剩下的就是把各个区间长度计算出来
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
const int N=2e4;
int a[N];
bool cmp(pii x,pii y)
{return x.se<y.se;
}
signed main()
{int n,k;cin>>n>>k;vector<pii>ve;vector<pii>ve1;for(int i=1;i<=n;i++){cin>>a[i];ve.push_back({a[i],i});}sort(ve.begin(),ve.end());int sum=0;for(int i=ve.size()-k;i<ve.size();i++)//这里反着写可能会出错,后面可能会运行错误{sum+=ve[i].fi;ve1.push_back({ve[i].fi,ve[i].se});}cout<<sum<<endl;sort(ve1.begin(),ve1.end(),cmp);if(k==1)cout<<n;else{for(int i=0;i<ve1.size();i++){if(i==0)cout<<ve1[i].se<<" ";else if(i==ve1.size()-1)cout<<n-ve1[ve1.size()-2].se<<" ";elsecout<<ve1[i].se-ve1[i-1].se<<" ";}}return 0;
}
5. F - Three Parts of the Array
这题就是从两边向中间模拟一遍就行了
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
const int N=2e5+6;
int a[N];
signed main()
{int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];if(n==1)cout<<"0";else{ int l=1;int r=n;int sum=a[l];int sum1=a[r];int p=0;while(l<r){if(sum<sum1){l++;sum+=a[l];} else if(sum>sum1){r--;sum1+=a[r];} else{p=max(p,sum);//更新相同时的值l++;sum+=a[l];r--;sum1+=a[r];}}cout<<p;}return 0;
}
6. H - Two Cakes
这题是利用二分答案来写,但是要注意check函数中的判断
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
int n,a,b;
bool check(int mid)//对此时最大蛋糕块数是在哪一个蛋糕中进行判断
{bool bl=0;if((a-mid)/mid>=0){int x=n-(a-mid)/mid-1;if(x<=0||b/x>=mid)bl=1;}if((b-mid)/mid>=0){int x=n-(b-mid)/mid-1;if(x<=0||a/x>=mid)bl=1;}if(bl)return 1;elsereturn 0;
}
signed main()
{cin>>n>>a>>b;int l=1;int r=a+b;while(l<r){int mid=(l+r+1)/2;if(check(mid))l=mid;elser=mid-1;}l=min(l,a);l=min(l,b);cout<<l;return 0;
}