【A】
【题意】给了你a,b,c,现在这个数列第一项是a,公差是c,问你有没有可能这个数列中有一项为b?水题,分类讨论一下即可。
int main(){
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c)){
if(c==0){
if(a==b){
puts("YES");
}else{
puts("NO");
}
}else if(c>0){
if(a>b){puts("NO");}
else if(a==b){puts("YES");}
else{
if((b-a)%c==0){
puts("YES");
}else{
puts("NO");
}
}
}else{
if(a<b){puts("NO");}
else if(a==b){puts("YES");}
else{
if((a-b)%(-c)==0){
puts("YES");
}else{
puts("NO");
}
}
}
}
return 0;
}
【B】
【题意】给了一个9宫格,并且给了4个数,现在要求你找出剩下的数字有多少种排列方式,使得所有的2*2的方格里面的数等于最左上角的2*2的矩形的数的和。
【分析&解题思路】设最左上角的数x,中间那个数为y。解方程即可退出正确的解题姿势。
【AC代码】
#define ll long long
int n;
bool judge(int x){
if(x>=1&&x<=n) return true;
return false;
}
int main(){
ll ans=0;
int a,b,c,d;
cin>>n>>a>>b>>c>>d;
for(int i=1; i<=n; i++){
if(judge(i+b-c)&&judge(i+a-d)&&judge(i+a+b-c-d))ans++;
}
cout<<(ll)ans*n<<endl;
return 0;
}
【C】给了你n个数,保证这n个数的和是0,现在要你用最少的步数,使得所有的数都变成0,操作是可以把一个数加到相邻的另一个数上。
【分析&解题思路】选取尽量多的区间和为0的区间。因为,区间和为0了,里面就可以随便分配了。
【AC代码】
#define ll long long
map<ll,int>mp;
int main(){
int n,now,ans=0;
ll sum=0;
cin>>n;
for(int i=0; i<n; i++){
cin>>now;
sum+=(ll)now;
mp[sum]++;
ans=max(ans,mp[sum]);
}
cout<<n-ans<<endl;
return 0;
}
【D题意】在一颗排二叉树上来进行操作。我看了别人的题解,模仿了别人的解题代码。
【吐槽】以为是平衡树的,cf真是在不断刷新我的脑洞。。。
【AC代码】
#define ll long long
set<int>s;
map<int,int>lson,rson;
int main(){
int n,now;
cin>>n;
for(int i=0; i<n; i++){
cin>>now;
auto it=s.lower_bound(now);
if(i==0)
s.insert(now);
else{
if(it==s.end()) rson[*--it]=now;
else{
if(!lson[*it]) lson[*it]=now;
else rson[*--it]=now;
}
cout<<*it<<" ";
s.insert(now);
}
}
return 0;
}