题目
废物的日常罚坐,www…
某大佬真是个好演员…
A. Make Even
链接.
思路:
每一位都是奇数输出-1;
原本就是偶数输出0;
最高位为偶数输出1;
其他为2;
#include<bits/stdc++.h>
#define ll long long
ll mod =1e9+7;
using namespace std;
int t;
int n;
vector<int >v;
int main()
{
//ios::sync_with_stdio(0);
//cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;
int k=-1;
if(n%2==0)k=0;
else
{
int x=n;
int flag=0;
while(x>0)
{
if(x%2==0)
{
flag=1;
break;
}
else x=x/10;
}
if(flag)
{
k=2;
while(n/10>0)
{
n=n/10;
}
if(n%2==0)k=1;
}
}
cout<<k<<"\n";
}
return 0;
}
B. Team Composition: Programmers and Mathematicians
链接.
题意:四个人为一组,每组至少有一个A类人和一个B类人,A,B类人的人数为a,b;求最多可组成几组。
#include<bits/stdc++.h>
#define ll long long
ll mod =1e9+7;
using namespace std;
int t;
int a,b;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>a>>b;
int x=(a+b)/4;
if(a>=x&&b>=x);
else x=min(a,b);
cout<<x<<"\n";
}
return 0;
}
C. Polycarp Recovers the Permutation
链接.
题意:
有两个
1
1
1-
n
n
n的排列
p
1
p1
p1,
p
2
p2
p2;
p
2
p2
p2由
p
1
p1
p1得到:每次取
p
1
p1
p1最左端和最右端两个中比较小的一个放在
p
2
p2
p2的一端(如果取自
p
1
p1
p1的左端就必须放到
p
2
p2
p2的左端,如果取自
p
1
p1
p1的右端就必须放到
p
2
p2
p2的右端,
p
1
p1
p1只剩一个数时随便放(因为既是右端又是左端));
现给出排列
p
2
p2
p2,求出
p
1
p1
p1(答案不唯一),若不存在这样的
p
1
p1
p1则输出-1;
思路:
n
n
n必须在
p
2
p2
p2的最左端或最右端;
若不满足则输出-1;
若满足输出n然后将其他数倒序输出即可。
#include<bits/stdc++.h>
#define ll long long
ll mod =1e9+7;
using namespace std;
int t;
int n,a[200010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
if(a[1]!=n&&a[n]!=n)
{
cout<<"-1\n";
continue;
}
cout<<n<<" ";
for(int i=n;i>=1;i--)
{
if(a[i]!=n)cout<<a[i]<<" ";
}
cout<<"\n";
}
return 0;
}
F. ATM and Students
链接.
算是双指针问题吧,打的时候因为细节wa了好久。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,t;
ll s,a[200010];
int main()
{
// ios::sync_with_stdio(0);
//cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>s;
int flag=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]+s>=0)flag=1;
}
if(!flag)
{
cout<<"-1\n";
continue;
}
int maxn=-1,f=0,l=1;
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=a[i];
if(ans+s>=0)
{
if(i-l>maxn)
{
maxn=i-l;
f=l;
}
}
else
{
while(ans+s<0)
{
ans-=a[l];
l++;
}
}
}
cout<<f<<" "<<f+maxn<<"\n";
}
return 0;
}