1.
计算 Σ1-AΣ1-BΣ1-C abc的值
解析:在这种求和题中,a b c 可以被 提到前面变成
Σa ΣbΣc
然后分别运用等差数列计算
注意事项:每一项在计算的过程中都要进行取余操作
计算完成之后,在三项相乘时
需要先将前两个相乘 →取余
再将算好的结果跟最后一个相乘 →取余 否则会发生爆long long 的结果
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
int main()
{
long long a,b,c;
cin>>a>>b>>c;
long long suma=0,sumb=0,sumc=0;
suma=(1+a)*a/2%mod;
sumb=(1+b)*b/2%mod*suma%mod;
sumc=(1+c)*c/2%mod*sumb%mod;
cout<<sumc;
return 0;
}
2.
一个宽为L的道路上,有N盏路灯
输入N,L
下一行输入 N个数字,表示 路灯在道路上的位置坐标
假设d时每个路灯的照明半径,问当照明半径d能将整个道路(0-L) 全部点
亮的最小值是多少
N<=1000,L<=1E9
思路
我最开始的想法是进行二分,但是写好了之后,发现二分并不能处理浮点数的计算,因为题目中的输出d的最小值为浮点数,所以二分的方法失败了。
然后考虑贪心
发现规律:0-最左边路灯的距离。L到最右边路灯的距离,所有路灯中两个相距最远的路灯之间距离的一半,这三者的最大值即为我们所要求的d的最小值
总结:贪心这种题是最难想,也是最考验思维的一种体型,有的时候真的觉得他的规律来的莫名其妙,但是自己推一推还真是这样的,很玄学。
#include<bits/stdc++.h>
using namespace std;
double t[1001];
int main()
{
int n,l;
cin>>n>>l;
for(int i=1;i<=n;i++)
{
cin>>t[i];
}
sort(t+1,t+1+n);
double mmax=-1;
for(int i=2;i<=n;i++)
{
mmax=max(mmax,(t[i]-t[i-1])/2);
}
double ans=max(mmax,t[1]-0);
ans=max(ans,l-t[n]);
printf("%.10lf",ans);
return 0;
}
3
输入N,K;
存在a,b ,c,d 1<=a,b,c,d<=N
使得 a+b-c-d=K;
求出所有符合 此情况的 个数
思路
首先对式子进行处理:
a+b=k+(c+d)
设f(i)为 a+b=i 的情况数
此时 a+b=k+(c+d)
设 c+d=i;
则 k+(c+d) 则类比 i
所以左边的情况个数 为 f(i+k)
右边的情况个数
f(i)
所以则有 f(i)=f(i+k)
这里其实很难想,这个推理我也是醉了。
所以满足这个式子的情况数 就等于 f(i) * f(i+k) 求和
所以我们这边设置了一个数组名为haha[i]
即为 a+b=i,的情况数
利用差分算法
for(int i=1;i<=n;i++)
{
haha[i+1]++;
haha[i+1+n]–;
}
for(int i=1;i<maxn,i++)
{
haha[i]+=haha[i-1]
}
经过这些操作,直接就可以算出 haha[i]的值了
然后对 haha[i]*haha[i+k]进行求和即为答案( i+k要确保合法)
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;
long long haha[maxn];
int main()
{
long long n,k;
cin>>n>>k;
for(int i=1;i<=n;i++
{
haha[i+1]++;
haha[i+1+n]--;
}
for(int i=1;i<2e6+5;i++)
{
haha[i]+=haha[i-1];
}
long long ans=0;
for(int i=1;i<2e6+5;i++)
{
if(k+i>=0&&k+i<2e6+5)
{
ans+=haha[i]*haha[k+i];
}
}
cout<<ans;
return 0;
}
4.
持续更新。。。。
糖果,二进制枚举,二分查找。