abc369a 369
非常简单的等差数列。分类讨论的重要性!比如 x == y 就只有一种方法
#include<bits/stdc++.h> #define ll long long using namespace std; int x,y; int main(){ cin>>x>>y; if(x == y) cout<<1<<endl; else if((x - y) % 2 == 0) cout<<3<<endl; else cout<<2<<endl; return 0; }
ABC346C 求和
考察等差数列
一句话题意:给定一个数x,求n个数字在1~x中没有出现过的数字之和。
C Count Arithmetic Subarray 计算数学子序列
等差数列
这道题思维难度是有了。。。如果不是放在这个位置,一定会往难了想
最终自己造数据,看样例,找规律,发现性质,如果是非1,2长度的等差数列,一定是一段一段的。
#include<bitsstdc++.h> #define ll long long using namespace std; //最开始想到递归,然后又是递推 //又想到区间dp,因为不能1-2,1-3,1-4,1-5...这样去枚举 //但是,需要存储的信息太多了 //又想到尺取 2个可以推出3个,3个加一个变成4个 //可是数据范围明显需要一个log,这个 //所以没有任何办法记录左右两端...怎么办? //二分? //从d出发? //差分? //性质?观察规律? //自己举样例 int cnt = 2, p, n, x, d; ll sum; int main(){ cin>>n; //特判一下 if(n == 1){ cout<<1<<endl; return 0; } if(n == 2){ cout<<3<<endl; return 0; } sum += n + n - 1; cin>>p>>x; d = x - p; p = x; for(int i = 3; i <= n; i++){ cin>>x; if(x - p == d){//如果存在这个条件,则至少三个 cnt++; cout<<"iii: "<<i<<" "<<d<<" "<<cnt<<endl; } else{ sum += (1ll + cnt - 2) * (cnt - 2ll) / 2;//有cnt个数凑成等差数列,形成1个和2个的不算 cnt = 2;//比如5个数,可以凑成5个数的1个序列,4个数的2个序列,3个数的3个序列。即1+2+3 } d = x - p; p = x; } sum += (1ll + cnt - 2) * (cnt - 2ll) / 2; cout<<sum<<endl; return 0; }
ABC369B 钢琴
一句话题意:分别按照顺序移动左手花费代价+右手花费代价
简单模拟,注意打标记的处理技巧(给第一次出现的数字打标记)
#include<bits/stdc++.h> using namespace std; int n,x,sum,lx,rx,al,ar,fl,fr; char c; int main(){ cin>>n; for(int i = 1; i <= n; i++){ cin>>x>>c; if(c == 'L'){ sum += abs(x - lx); if(fl == 0) al = x; fl = 1; lx = x; } else { sum += abs(x - rx); if(fr == 0) ar = x; fr = 1; rx = x; } } cout<<sum - ar - al<<endl; return 0; }