解题情况 3of 9 A B C 日期 9.1
目录
A. Increasing and Decreasing
题目分析:
代码:
B. Swap and Reverse
题目分析:
代码:
C. Divisor Chain
A. Increasing and Decreasing
题目分析:
x->y递增,且每次加的数要比前一次要小,判断一下,从x到y这个区间是否能承载满足这个条件的数,这里我们选择最有可能的情况,也即y-1,(y-1)-2,(y-1-2)-3... 可以转化为(y-x)和 1+2+3+...(n-2)比较,到n-2的原因是去掉了x和y。如果可以的化,就按照这样的形式输出即可,否则输出-1
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sum[1000];
bool isok(int a,int b,int n)
{
ll sum=0;
sum+=a;
for(int i=1;i<=n-2;i++)
{
sum+=i;
}
if(sum+(n-2)<b)return true;
else return false;
}
int main()
{
int t;cin>>t;
while(t--)
{
int x,y,n;cin>>x>>y>>n;
isok(x,y,n);
if(!isok(x,y,n))cout<<"-1"<<endl;
else
{
ll p=0;
cout<<x<<" ";
for(int i=1;i<=n-2;i++)
{
p+=i;
sum[i]=y-p;
}
for(int i=n-2;i>=1;i--)cout<<sum[i]<<" ";
cout<<y<<endl;
}
}
}
B. Swap and Reverse
题目分析:
两种交换方式:
①i和 i+2 交换,也即 奇奇交换,偶偶交换
② (1)k为奇 也等同于 奇奇交换,偶偶交换
(2)k为偶 等同于 奇偶可以交换
所有整体上取决于k的奇偶,若k为奇,则分别在奇数范围内和偶数范围内寻求最优解输出
反之则可以在整个字符串上寻求最优解输出
代码:
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+7;
char a[N];
char a1[N],a2[N];
bool cmp(char a ,char b)
{
return a<b;
}
int main()
{
int t;cin>>t;
while(t--)
{
int n,k;cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
if(k%2==0)
{
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
cout<<a[i];
}
cout<<endl;
}
else
{
int o=0,p=0;
for(int i=0;i<n;i++)
{
if((i+1)%2)
{
a1[o++]=a[i];
}
else
{
a2[p++]=a[i];
}
}
sort(a1,a1+o,cmp);
sort(a2,a2+p,cmp);
if(n%2)
{for(int i=0;i<p;i++)
{
cout<<a1[i]<<a2[i];
}
cout<<a1[o-1]<<endl;
}
else
{
for(int i=0;i<p;i++)
{
cout<<a1[i]<<a2[i];
}
cout<<endl;
}
}
}
}
C. Divisor Chain
题目分析:
从x减到1,每次减的数都必须是当前数的除数,减的数的使用次数不能超过两次
第一反应为判断素数,因为素数只能-1,题目又说,数据保证合法,所以,从这方面考虑,最终发现不太可能实现。
看到了一个大佬使用的位运算之类的方式做的特别简单
分为两步:
1.找到x内的最大二进制位数并 把x减到 比如 9-> 20 ->
2.将 减到1
代码:
#include <bits/stdc++.h>
#define all(a) (a).begin(), (a).end()
#define sz(a) (int)(a).size()
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
bool bit(int mask, int pos) {
return (mask >> pos) & 1;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int tt;
cin >> tt;
while (tt--) {
int x;
cin >> x;
int p;
vector<int> ans;
ans.pb(x);
for (int i = 0; ; ++i) {
if (bit(x, i)) {
if (x == (1 << i)) {
p = i;
break;
}
x -= (1 << i);
ans.pb(x);
}
}
while (p > 0) {
x -= (1 << (p - 1));
ans.pb(x);
--p;
}
cout << sz(ans) << "\n";
for (int y : ans) {
cout << y << " ";
}
cout << "\n";
}
}