【第三期测试1】愧疚指数

题目描述:

温州市政府要求大家要遵守交通规则,发扬尊老爱幼精神。文文想做一个关于公交文化的调查。他专门为排队上车发明了一套叫做“愧疚指数”的分析系统,就是在队列中把人分为三等:第一等为优先级最高,最需要照顾的老人、小孩、孕妇等,应该最优先上车,优先代号为1;第二等是普通女人,为了发扬绅士风度,男人是要让女人先上车的,但优先级低于一等,优先代号为2;第三等是普通男人,优先级最低,应该排在最后面,优先代号为3。所谓的“愧疚指数”是指队列中一个人后面有多少人的优先级比他高,如队列中有5个人分别为:3 2 1 2 1,那么这5个人的“愧疚指数”分别为:4 2 0 1 0。现在已经知道一个队列,请你帮文文算出队列中每个人的“愧疚指数”。

输入格式:

第一行是一个正整数n,表示一共有多少个人排队。

第二行有n个用空格隔开的正整数,它们从左至右给出了队列中n个人的优先代号。

输出格式:

输出一行:有n个用空格分开的正整数,代表队列中每个人的“愧疚指数”。

样例输入:
5
3 2 1 2 1
样例输出:
4 2 0 1 0
提示:

对于80%的数据,n≦10000;

对于100%的数据,n≦200000。

时间限制: 1000ms
空间限制: 256MB

代码需要从O(n^2)优化到O(n),否则会超时。

代码实现:
#include<bits/stdc++.h>
using namespace std;
long long s1,s2,a[10000001],b[10000001],n;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n;i>=1;i--){//由于输入是倒序输入,遍历也要倒序遍历
		if(a[i]==1){
			b[i]=0;
			s1++;
            //数字1出现了s1次
		}
		if(a[i]==2){
			b[i]=s1;//比2小的只有1,所以这里标记的是1的个数
			s2++;
            //数字2出现了s2次
		}
		if(a[i]==3)b[i]=s2+s1;//1和2都比3小,所以比a[i]小的数是前面s1和s2的总和
	}
	for(int i=1;i<=n;i++)cout<<b[i]<<" ";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值