2019.05.04 【NOIP提高组】模拟 B 组 排序+堆+贪心+枚举

21 篇文章 0 订阅
16 篇文章 0 订阅

0 竞赛排名

在这里插入图片描述

直接模拟,排序

#include <cstdio> 
#include <algorithm>

using namespace std;

int n;
int x[1005][15];
double avg[15],xa[1005];
struct node{
	double sy;
	int sx,s;
}a[1005];

double abb(double x){
	if (x<0) return -x;
	return x;
}

bool comp(node a,node b){
	if (abb(a.sy-b.sy)<=0.000000001){
		if (a.sx==a.sy)
		return a.s<b.s; else return a.sx>b.sx;
	} else
	return (a.sy>b.sy);
}

int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=8;j++){
			scanf("%d",&x[i][j]);
			a[i].sx+=x[i][j];
			avg[j]+=(double)x[i][j]/n;
		}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=8;j++)
			xa[j]+=(double)abb(x[i][j]-avg[j])/n;
	for (int i=1;i<=n;i++){
		a[i].s=i;
		for (int j=1;j<=3;j++)
		if (abb(x[i][j]-avg[j])>0.000000001)
			a[i].sy+=(double)(x[i][j]-avg[j])/xa[j];
		for (int j=4;j<=8;j++)
		if (abb(x[i][j]-avg[j])>0.000000001)
			a[i].sy+=(double)0.8*(x[i][j]-avg[j])/xa[j];
	}
	sort(a+1,a+1+n,comp);
	for (int i=1;i<=n;i++)
		printf("%d\n",a[i].s); 
}

1 奶牛晒衣服

在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。
  圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用1的时间可以晒干A点湿度。抠门的熊大妈买了1台烘衣机。使用烘衣机可以让你用1的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1的时间内只能对1件衣服使用。
  N件衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0为干)。
    第一行N,A,B;接下来N行,每行一个数,表示衣服的湿度(1<=湿度,A,B<=500000,1<=N<=500000)。
   
每次用烘干机烘最湿的衣服,那么就维护大根堆,每次大根堆堆顶-B,直到堆顶<A*次数

#include <cstdio>
#include <queue>

using namespace std;

priority_queue <int> q;
int n,ans,a,b;

int main(){
	scanf("%d%d%d",&n,&a,&b);
	for (int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		q.push(x);
	}
	while (q.top()>ans*a){
		ans++;
		int x=q.top();
		q.pop();
		x-=b; 
		q.push(x);
	}
	printf("%d",ans);
}

2 圆周舞蹈

熊大妈的奶牛在时针的带领下,围成了一个圆圈跳舞。由于没有严格的教育,奶牛们之间的间隔不一致。

奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到奶牛B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛间的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。

贪心

#include <cstdio>

int n;
int ans,l,r;
int a[300005];
const int N=499667562;

int maxx(int a,int b){
	if (a<b) return b;
	return a;
}

int minn(int a,int b){
	if (a<b) return a;
	return b;
}

int mo(int x){
	if (x>3*n) return x-n;
	return x;
}

int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		a[i+n]=a[i];
		a[i+n+n]=a[i];
	}
	int i=n-1,j=n+2,s=n+1;
	l=a[n],r=a[n+1];
	while (i>=j-n){
		if (l<r) l+=a[i],i--;
		    else r+=a[j],j++;
	}
	if (l<r) ans=l; else ans=r;
	for (int k=j-1-n;k<=j;k++){
		r+=a[k];l-=a[k];
		while (k>=s) r-=a[mo(s)],l+=a[mo(s)],s++;			
		while ((r<l)&&(k<s-1)) s--,r+=a[mo(s)],l-=a[mo(s)];
		while ((r>l)) r-=a[mo(s)],l+=a[mo(s)],s++;	
		ans=maxx(ans,minn(l,r));
	}
	if (ans==N) ans+=3;
	printf("%d",ans);
}

3 奶牛排队

奶牛在熊大妈的带领下排成了一条直队。

显然,不同的奶牛身高不一定相同。。。。。

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛A是最矮的,最右边的B是最高的,且B高于A奶牛,中间如果存在奶牛,则身高不能和A,B奶牛相同。问这样的奶牛最多会有多少头?

从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是0,2,但不会是1)。

那么,枚举,优化

#include <cstdio> 

using namespace std;

int n,ans=1;
int a[100005],t;

int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=n;i>ans;i--){
		for (int j=i-1;j;j--){
			if (a[i]<=a[j]) break;
			int b=0;
			for (int k=j+1;k<i;k++)
				if ((a[k]>=a[i])||(a[k]<=a[j])){
					b=1;
					break;
				}
			if (b==0){
				if (i-j+1>ans)
					ans=i-j+1;
				if (ans==n){
					printf("%d",ans);
					return 0;
				}
			}
		}
	}
	if (ans==1) ans=0;
	printf("%d",ans);
}

问灵十三载,等一不归人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值