Problem A
思路分析
直接累计各元素绝对值即可
AC代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=2e5+10;
void solve(){
int n,ans=0;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
if(x>0)ans+=x;
else ans-=x;
}
cout<<ans<<"\n";
}
int main(){
ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--){
solve();
}
}
Problem B
思路分析
两种操作:去除一个元素,或者某个元素+1。
其实可以发现,
s
u
m
sum
sum%
3
3
3结果只有
0
,
1
,
2
0,1,2
0,1,2.
0
:
0:
0:直接输出0即可。
1
:
1:
1:要不删去一个元素(其取模结果为1),要不加2,所以可以用个
f
l
a
g
flag
flag,看看有没有这样的元素存在。
2
:
2:
2:要不删去一个元素,要不加1,无所谓,都是两次操作。
AC代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e5+10;
void solve(){
int n,flag=0;cin>>n;
ll sum=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
if(x%3==1)flag=1;
sum+=x;
}
if(sum%3==0)cout<<0<<"\n";
else if(sum%3==2)cout<<1<<"\n";
else{
if(flag)cout<<1<<"\n";
else cout<<2<<"\n";
}
}
int main(){
ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--){
solve();
}
}
Problem C
思路分析
坐牢的开始qwq,自己想得太复杂了,其实直接用快速幂枚举
x
,
y
x,y
x,y即可(看了队里大佬的代码)。
这里去重有个小技巧,可以用
s
e
t
set
set,这样就可以不用写判断是否重复的条件(set可以直接去重),最后输出
s
e
t
.
s
i
z
e
(
)
set.size()
set.size()即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=2e5+10;
int quickpower(int a,int n){
int ans=1;
while(n){
if(n&1)ans*=a;
n>>=1;
a*=a;
}
return ans;
}
void solve(){
int a,b,l;cin>>a>>b>>l;
set<int> s;
for(int x=0;quickpower(a,x)<=l;x++){
//注意y的枚举条件是quickpower(a,x)*quickpower(b,y)<=l
for(int y=0; quickpower(a,x)*quickpower(b,y)<=l;y++){
int num=quickpower(a,x)* quickpower(b,y);
if(l%num==0){
//将l/num存入set中
s.insert(l/num);
}
}
}
cout<<s.size()<<"\n";
}
int main(){
ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--){
solve();
}
}
Problem D
思路分析
看看样例,可以大胆猜测一下,先从小到大排序,可以发现,
S
m
a
l
l
E
l
e
m
e
m
t
SmallElememt
SmallElememt%
B
i
g
E
l
e
m
e
m
t
BigElememt
BigElememt肯定不为0,那么这样贪心排序下来,如果可以得到结果不为0,满足题意,直接
r
e
t
u
r
n
return
return即可。
但是,需要特判是否有相同的情况,只需要考虑
a
0
、
a
1
a_0、a_1
a0、a1即可,后面是否连续无影响,如果
a
0
=
=
a
1
a_0==a_1
a0==a1,则不满足题意。
AC代码
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int MAXN=1e5+10;
void solve(){
int n;cin>>n;
vector<int>a(n);
for(int i=0;i<n;i++)cin>>a[i];
//元素按照从小到大排序
sort(a.begin(),a.end());
//特判
if(a[1]!=a[0]){
cout<<"YES\n";
return;
}
for(int i=1;i<n;i++){
//如果%!=0,输出yes
if(a[i]%a[0]!=0){
cout<<"YES\n";
return;
}
}
cout<<"NO\n";
}
int main(){
ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--){
solve();
}
}
Problem E
明天再补qwq