2019.05.04 【NOIP提高組】模擬 B 組 排序+堆+貪心+枚舉

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);
}

問靈十三載,等一不歸人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章