A. Forbidden Subsequence
题目:![](https://i-blog.csdnimg.cn/blog_migrate/6ed8ba5e18d3452e820d324b828a8a33.png)
思路分析:
就是一道构造题
哈希储存数据
如果b==abc的话 如果a b c其中一个字母没有的话 可以直接输出 如果a b c都有的话 按照a c b的顺序输出
其他情况也直接输出
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=2e5+10;
int t;
void solve(){
string a,b;
cin>>a>>b;
int c[MAX];
for(int i=0;i<26;i++) c[i]=0;
for(int i=0;i<a.size();i++) c[a[i]-'a']++;
if(b=="abc"){
if(c[0]==0||c[1]==0||c[2]==0){
for(int i=0;i<26;i++){
for(int j=0;j<c[i];j++){
// cout<<'a'+i;
printf("%c",'a'+i);
}
}
}
else {
if(c[1]!=0&&c[2]!=0){
for(int j=0;j<c[0];j++){
cout<<'a';
}
for(int j=0;j<c[2];j++){
// cout<<'a'+2;
printf("%c",'a'+2);
}
for(int j=0;j<c[1];j++){
// cout<<'a'+1;
printf("%c",'a'+1);
}
for(int i=3;i<26;i++){
for(int j=0;j<c[i];j++){
// cout<<'a'+i;
printf("%c",'a'+i);
}
}
}
}
}
else {
for(int i=0;i<26;i++){
for(int j=0;j<c[i];j++){
// cout<<'a'+i;
printf("%c",'a'+i);
}
}
}
cout<<endl;
}
int main(){
cin>>t;
while (t--) solve();
return 0;
}
B. GCD Problem
题目:![](https://i-blog.csdnimg.cn/blog_migrate/ce88758c9b0036202adaf084293aab6b.png)
思路分析:
也是一道构造题目 给你一个sum 要求你把他分解成三个数的 a b c
要满足 a+b+c=sum gcd(a,b)==c a!=b!=c 三个数不等
那么我们只需要让c=1 如果a+b&1的话 令a=2 c=sum-a-b gcd(a,b)=1
否则 遍历a 寻找满足的数据
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=2e5+10;
int t;
void solve(){
ll x;
cin>>x;
x--;
if(x&1){
cout<<2<<" "<<x-2<<" "<<1<<endl;
}
else {
for(ll i=2;i<=x;i++){
if(_gcd(i,x-i)==1){
cout<<i<<" "<<x-i<<" "<<1<<endl;
return;
}
}
}
}
int main(){
cin>>t;
while (t--) solve();
return 0;
}
C. Paprika and Permutation
题目:![](https://i-blog.csdnimg.cn/blog_migrate/aa37465c689fc4cd77b9b4c5abe48e35.png)
思路分析:
一道可以利用STL就可以解决的题目
就是给你一个序列 要让你把他变为包含1-n的序列 没要求从小到大
我们可以先遍历一遍其中1-n 包含了哪些 标记下来 标记一次就行 大于n的数据放到vector中
然后我们贪心的选取其中的数据来凑1-n中缺失的数
如果vector中最小的数据 a<=i*2的话 那么就无法凑出 直接输出-1返回就行
如果可以凑到1-n 那么答案就是最初容器的大小
代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read() {
int x=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
ll _gcd(ll m, ll n){return n == 0 ? m : _gcd(n, m%n);}
ll _lcm(ll m, ll n){return m*n / _gcd(m, n);}
ll pows(ll base, ll power,ll mod){ll result=1;while(power>0){if(power&1){result=result*base%mod;}power>>=1;base=(base*base)%mod;}return result;}
ll poww(ll base, ll power){ll result=1;while(power>0){if(power&1){result=result*base;}power>>=1;base=(base*base);}return result;}
const int MAX=2e6+10;
int t;
int a[MAX];
int vis[MAX];
vector<int>v;
bool cmp(int a,int b){return a>b;}
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++)vis[i]=0;
v.clear();
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]<=n&&!vis[a[i]]){
vis[a[i]]=1;
}
else v.push_back(a[i]);
}
int ans=v.size();
sort(v.begin(),v.end(),cmp);
for(int i=1;i<=n;i++){
if(!vis[i]){
if(i*2>=v.back()){
cout<<-1<<endl;
return;
}
else v.pop_back();
}
}
cout<<ans<<endl;
}
int main(){
cin>>t;
while (t--) solve();
return 0;
}