UPC个人训练赛28(做题记录)

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.

持续更新。。。。
糖果,二进制枚举,二分查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值