NEUQ2020训练赛1总结(codeforces Educational Codeforces Round 34 (Rated for Div. 2))

比赛链接:https://codeforces.com/contest/903

A题:
题意是给出一个整数n(1 ≤ n ≤ 100) ,要使得 3x + 7y = n (x,y ≥ 0),直接暴力就好了。

bool check = 0;
for(int i=0;i<=34;i++)
	for(int j=0;j<=15;j++)
		if((3*i+7*j)==n)
			check = 1;

B题:
模拟。
C题:
题意是有若干个正方体,知道每一个的边长,小正方体可以放进大正方体中(没错就是套娃),求最少能套成几个正方体。
相同大小的正方体不能出现在同一个套娃中,即最终看见的正方体数为出现最多的边长长度的数量,所以开个桶就完事了。

map<int,int>q;
int main()
{
	int n;cin>>n;
	int m=0;
	for(int i=0;i<n;i++){
		int x;cin>>x;
		q[x]++;
		m=max(m,q[x]);
	}
	cout<<m;
}

D题:
题意是给出一个数组a[n]:
d ( x , y ) = { y − x , if  ∣ x − y ∣ > 1 0 , if  ∣ x − y ∣ ≤ 1 , 求 ∑ 1 ≤ i ≤ j ≤ n d ( a i , a j ) d(x,y) = \begin{cases}y-x, &\text{if } |x-y|>1\\0, &\text{if } |x-y|≤1\end{cases} ,求\sum_{1≤i≤j≤n}d(a_i, a_j) d(x,y)={yx,0,if xy>1if xy11ijnd(ai,aj)

易得: ∑ 1 ≤ i < k d ( a i , a k ) = a k × s − s u m ( s 为 a k 之 前 与 a k 绝 对 值 大 于 一 的 个 数 , s u m 为 这 些 数 的 和 ) \sum_{1≤i<k}d(a_i, a_k) = a_k×s -sum(s为a_k之前与a_k 绝对值大于一的个数,sum为这些数的和) 1i<kd(ai,ak)=ak×ssum(sakaksum)
又有,
∑ 1 ≤ i ≤ j ≤ n d ( a i , a j ) = ∑ 1 ≤ j ≤ n ∑ 1 ≤ i < j d ( a i , a j ) \sum_{1≤i≤j≤n}d(a_i, a_j)=\sum_{1≤j≤n}\sum_{1≤i<j}d(a_i, a_j) 1ijnd(ai,aj)=1jn1i<jd(ai,aj)
可以在O(n)时间复杂度求出答案。
坑点:这道题卡long long的范围,用了long double才过…

#define ld long double 
#define fo1(i,n) for(int i=1;i<=n;i++)
map<ld,ld>q;
ld a[N];
int main()
{
	ld n;cin>>n;
	ld sum=0;
	fo1(i,n){
		cin>>a[i];
		q[a[i]]++;
		sum+=a[i];
	}
	ld s=0;
	for(int i=n;i>0;i--){
		sum-=a[i];q[a[i]]--;
		ld t=sum-a[i]*q[a[i]]-(a[i]-1)*q[a[i]-1]-(a[i]+1)*q[a[i]+1];
		ld tt=q[a[i]]+q[a[i]-1]+q[a[i]+1];
		s+=((i-1-tt)*a[i]-t);
	}
	cout<<fixed<<setprecision(0)<<s<<endl;
}

E题:
暴力+剪枝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值