A:Turtle Puzzle:Rearrange and Negate
题面:
分析:
贪心
先将所有负数放到一起,然后变成正数,最终答案是所有元素的绝对值之和
代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e2+10,M=1e9+7;
int n;
int a[N];
void solve()
{
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
ans+=abs(a[i]);
}
cout<<ans<<'\n';
}
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
B:Turtle Math:Fast Three Task
题面:
分析:
分类讨论
开一个桶数组记录数组中%3后各种结果的个数
算出原始数组所有元素之和%3的值sm,分情况讨论:
sm=0,原本就是3的倍数,答案为0
sm=1,如果vis[1]>0(vis[1]表示%3=1的元素的个数),移除其中一个元素即可,答案为1;如果vis[1]=0,那么随便选一个元素将其数值加2即可,答案为2
sm=2,那么随便选一个元素将其数值加1即可,答案为1,其他方法不会更优
代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10,M=1e9+7;
int n;
int a[N],vis[4];
void solve()
{
cin>>n;
int sm=0;
for(int i=0;i<4;i++){
vis[i]=0;
}
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]%=3;
sm=(sm+a[i])%3;
vis[a[i]]++;
}
if(sm==0){
cout<<0<<'\n';
}else if(sm==1){
if(vis[1]){
cout<<1<<'\n';
}else{
cout<<2<<'\n';
}
}else if(sm==2){
cout<<1<<'\n';
}
}
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
C:Turtle Fingers:Count the Values of k
题面:
分析:
暴力
暴力枚举x,y,找到对应的k,去重即可,算次幂可以用快速幂
时间复杂度O(t log l log l)
代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=2e5+10,M=1e9+7;
int a,b,l;
int fastpow(int a,int n)//快速幂
{
int ans=1;
while(n)
{
if(n&1){
ans*=a;
}
a*=a;
n>>=1;
}
return ans;
}
void solve()
{
cin>>a>>b>>l;
int k;
set<int> st;//集合去重
for(int i=0;fastpow(a,i)<=l;i++){//暴力
int ax=fastpow(a,i);
if(l%ax==0){
for(int j=0;fastpow(b,j)<=l/ax;j++){
int by=fastpow(b,j);
if(l/ax%by==0){
st.insert(l/ax/by);
}else{
break;
}
}
}else{
break;
}
}
cout<<st.size()<<'\n';
}
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
D:Turtle Tenacity:Continual Mods
题面:
分析:
贪心
首先对数组从小到大排个序
可以发现,当最小的元素只有一个时,可以直接按这个顺序进行mod,结果是a[1]!=0,YES
如果最小元素不止一个,那么可以通过其他元素用取模的方式构造一个更小的元素放在第一个位置,如果能构造,YES;否则NO
判断能否,如果其它元素都是最小元素的倍数,那么不能构造;如果不是,则能构造
代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10,M=998244353;
int n;
int a[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
if(a[2]==a[1]){
for(int i=3;i<=n;i++){
if(a[i]%a[1]){
cout<<"YES"<<'\n';
return;
}
}
}else{
cout<<"YES"<<'\n';
return;
}
cout<<"NO"<<'\n';
}
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
E:Turtle vs. Rabbit Race:Optimal Trainings
题面:
分析:
二次函数、前缀和、二分
首先题意,对于一个数组,给你一个l,让你选最小的r使:
对于给定的u令:
最大
那么,,当
时取得最大值,找最接近这个值并且最左边的k所对应的r即可
前缀和处理,有
二分前缀和数组找到第一个大于等于u+1的k,即找到第一个大于等于sun[l-1]+k的sum[r]
如果r>n,r取等于n
比较左右两边表达式的值(应该要开long long),如果左边大于等于右边,r--
如果r<l,r取等于l
代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10,M=1e9+7;
ll n,q;
ll a[N],sum[N];
void solve()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
cin>>q;
while(q--){
ll l,u;
cin>>l>>u;
ll r=lower_bound(sum+1,sum+n+1,u+sum[l-1]+1)-sum;
if(r>n){
r--;
}
ll left=sum[r-1]-sum[l-1],right=sum[r]-sum[l-1];
if(2*u*left-left*left+left>=2*u*right-right*right+right){//左右比较,/2消掉了
r--;
}
if(r<l){
r=l;
}
cout<<r<<" ";
}
cout<<'\n';
}
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int T=1;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
F:Turtle Mission:Robot and the Earthquake
题面:
G:Turtle Magic:Royal Turtle Shell Pattern
题面: