模拟算法专题

1.外卖店优先级(New Online Judge

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int order[N]; //order[id] 第id号店上一次的订单
int prior[N]; //prior[id] 第id号店的优先级
int flag[N]; //flag[id] 第id号店在不在优先缓存中
struct node {
	int time,id;
} a[N];
bool cmp(node a, node b) {
	if(a.id==b.id)
		return a.time<b.time;
	return a.id<b.id;
}
int main() {
	int m,n,T;
	cin>>n>>m>>T;
	for(int i=0; i<m; i++)
		cin>>a[i].time>>a[i].id;
	sort(a,a+m,cmp); //按时间排序
	for(int i=0; i<m; i++) {
		int tt=a[i].time, id=a[i].id;
		if(tt != order[id]) //如果当前订单不等于上一次的订单,则减去它们之间的间隔
			prior[id] -= tt-order[id]-1;
		prior[id] = prior[id] < 0 ? 0: prior[id]; //不小于0
		if(prior[id]<=3) flag[id]=0;
		prior[id]+=2;
		if(prior[id]> 5) flag[id]=1;
		order[id]=tt;
	}
	for(int i=1; i<=n; i++) //最后处理第T时刻
		if(order[i]<T) {
			prior[i] -= T-order[i];
			if(prior[i]<=3)
				flag[i]=0;
		}
	int ans=0;
	for(int i=0; i<=n; i++)
		if(flag[i])
			ans++;
	cout<<ans;
	return 0;
}

2.付账问题(New Online Judge

#include <bits/stdc++.h>
using namespace std;
const int M=5e5;
long long a[M];
int main() {
	int n;
	long long s;
	scanf("%d %ld",&n,&s);
	for(int i=1; i<=n; i++) scanf("%ld",&a[i]);
	sort(a+1,a+n+1); //排序,从小到大
	double avg=1.0*s/n; //平均值
	double sum=0.0;
	for(int i=1; i<=n; i++) {
		if(a[i]*(n+1-i)<s) { //需要把钱全拿出的人:(1)钱不够平均数的,(2)钱够平均
			sum+=(a[i]-avg)*(a[i]-avg);
			s-=a[i]; //更新剩余钱数
		} else { //不用把钱全拿出的人:非常有钱,不管怎么平均都够
			double cur_avg=1.0*s/(n+1-i); //更新平均出钱数
			sum += (cur_avg-avg)*(cur_avg-avg)*(n+1-i);
			break;
		}
	}
	printf("%.4f",sqrt(sum/n));
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值