A. Make Even
题意:
给你一个数字,你可以任意反转他的前缀,问最少反转几次可以使得这个数为偶数
分析:
首先很明显的是,如果给的数中每一位都是奇数那么很明显不可能
- 刚开始就是偶数答案为0
- 最高位为偶数答案为1
- 其次答案为2
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
int T;cin>>T;
while (T--)
{
int num;cin>>num;
if (num%2==0)
{
cout<<"0\n";
continue;
}vector<int> ns;
int cnt=0;
while (num)
{
ns.push_back(num%10);
if (num%10%2==0)++cnt;
num/=10;
}
if (cnt==0)
{
cout<<"-1\n";
continue;
}
if (ns.back()%2==0)
{
cout<<"1\n";
continue;
}
cout<<"2\n";
}
}
B. Team Composition: Programmers and Mathematicians
题意:
有 a a a个数学家, b b b个工程师,要求组最多的 4 4 4人队伍,要求每个队伍至少有一名数学家和一名工程师
分析:
如果 a = b a=b a=b,那么我们肯定两个数学家两个工程师这样组队
如果不相等的话,那么我们肯定先让人多派三个人,人少的派一个人。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
int T;cin>>T;
while (T--)
{
int n,m;cin>>n>>m;
if (n<m)swap(n,m);
int cnt = min({n/3,m,(n-m)/2});
n -= 3*cnt;
m -= cnt;
cout<<cnt+min(n/2,m/2)<<"\n";
}
}
C. Polycarp Recovers the Permutation
题意:
一个长为 n n n的排列,每次对比两端数字的大小,取小的数字
- 小的数字是左端的,则放入新排列的左端
- 小的数字是右端的,则放入新排列的右端
如此,构成了一个新排列
现在给你一个新排列,要求你构造出老排列
分析:
很明显的一个结论是,最大的那个数 n n n一定在新排列的最左端过着最右端
因为,他是最大的,一定是最后被放入的
然后我们可以这样构造老排列,先在新排列找到最大的数 n n n,然后翻转其他的数
就是老排列了
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+100;
int a[maxn];
int n;
int main()
{
ios::sync_with_stdio(0);
int T;cin>>T;
while (T--)
{
cin>>n;
for (int i=1;i<=n;++i)cin>>a[i];
if (a[1]==n)reverse(a+2,a+1+n);
else if (a[n]==n)reverse(a+1,a+n);
else
{
cout<<"-1\n";
continue;
}
for (int i=1;i<=n;++i)cout<<a[i]<<" ";cout<<endl;
}
}
D. Weights Assignment For Tree Edges
题意:
给你一棵树&#