2021.07.06 考试(还没初中生考得高,哎!)

80=0+80+0

T1.tanning分配防晒霜

Description

奶牛们计划着去海滩上享受日光浴。为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜。第i头奶牛适合的最小和最 大的SPF值分别为minSPF_i和maxSPF_i(1 <= minSPF_i <= 1,000; minSPF_i <= maxSPF_i <= 1,000)。如果某头奶牛涂的防晒霜的SPF值过小,那么阳光仍然能 把她的皮肤灼伤;如果防晒霜的SPF值过大,则会使日光浴与躺在屋里睡觉变得 几乎没有差别。为此,奶牛们准备了一大篮子防晒霜,一共L(1 <= L <= 2500)瓶。第i瓶 防晒霜的SPF值为SPF_i(1 <= SPF_i <= 1,000)。瓶子的大小也不一定相同,第i 瓶防晒霜可供cover_i头奶牛使用。当然,每头奶牛只能涂某一个瓶子里的防晒霜 ,而不能把若干个瓶里的混合着用。 请你计算一下,如果使用奶牛们准备的防晒霜,最多有多少奶牛能在不被灼 伤的前提下,享受到日光浴的效果?

Input

* 第1行: 2个用空格隔开的整数:C和L

* 第2..C+1行: 第i+1行给出了适合第i头奶牛的SPF值的范围:minSPF_i以及 maxSPF_i * 第C+2..C+L+1行: 第i+C+1行为了第i瓶防晒霜的参数:SPF_i和cover_i,两个 数间用空格隔开。

Output

* 第1行: 输出1个整数,表示最多有多少头奶牛能享受到日光浴

Sample Input

3 2
3 10
2 5
1 5
6 2
4 1

输入说明:

一共有3头奶牛,2瓶防晒霜。3头奶牛适应的SPF值分别为3..10,2..5,以
及1..5。2瓶防晒霜的SPF值分别为6(可使用2次)和4(可使用1次)。可能的分
配方案为:奶牛1使用第1瓶防晒霜,奶牛2或奶牛3使用第2瓶防晒霜。显然,最
多只有2头奶牛的需求能被满足。

Sample Output

2

Hint

Source

Gold

分析:贪心。每头牛在自己范围内取值最小的

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<bits/stdc++.h>
using namespace std;
const int N=2510;
int n,m,vis[N],ans;
struct cowi{
	int s,t;
}cow[N];
struct nodei{
	int num,sum;
	bool operator <(const nodei &b)const{
		return num<b.num;
	}
}tan[N];
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
} 

int main(){
	freopen("tanning.in","r",stdin);
	freopen("tanning.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++){
		cow[i].s=read();cow[i].t=read();
	}
	for(int i=1;i<=m;i++){
		tan[i].num=read();tan[i].sum=read();
	}
	sort(tan+1,tan+m+1);
	//cout<<"    case 1"<<endl;//
	//for(int i=1;i<=n;i++)cout<<cow[i].s<<" "<<cow[i].t<<endl;//
	for(int i=1;i<=m;i++){
		//cout<<"    case 2"<<endl;//
		for(int j=1;j<=tan[i].sum;j++){
			//cout<<"    case 3"<<endl;
			int minn=0x3f3f3f3f,id=0;
			for(int k=1;k<=n;k++){
				if(vis[k])continue;
				if(cow[k].s>tan[i].num||cow[k].t<tan[i].num)continue;
				if(cow[k].t<minn){
					minn=cow[k].t;
					id=k;
				}
			}
			if(id){
				++ans;
				vis[id]=1;
			}
		}
	}
	//for(int i=1;i<=n;i++)cout<<vis[i]<<" ";cout<<endl;
	cout<<ans;
	return 0;
}

T2.雷达安装 P1325

P1325 雷达安装 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

分析:贪心,和种树一样

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int N=1100;
int n,d,top,vis[N*2],ans;
double ai[N*2];
struct node{
	int x,y;
	int xhminn,xhmaxn;
	double minn,maxn;
	bool operator <(const node &b)const{
		return xhmaxn==b.xhmaxn?xhminn<b.xhminn:xhmaxn<b.xhmaxn;
	}
}a[N];
map<double,int>mapi;
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
bool cmp(double x,double y){
	return x<y;
}
int main(){
	freopen("New.in","r",stdin);
	freopen("New.out","w",stdout);
	n=read();d=read(); 
	for(int i=1;i<=n;i++){
		a[i].x=read();a[i].y=read();
		a[i].minn=(double)a[i].x-(double)sqrt((double)d*d-(double)a[i].y*a[i].y);
		a[i].maxn=(double)a[i].x+(double)sqrt((double)d*d-(double)a[i].y*a[i].y);
		ai[++top]=a[i].minn;ai[++top]=a[i].maxn;
	}
	sort(ai+1,ai+top+1,cmp);
	//for(int i=1;i<=top;i++)cout<<ai[i]<<" ";cout<<endl;
	int len=unique(ai+1,ai+top+1)-ai-1;
	for(int i=1;i<=n;i++){
		a[i].xhminn=lower_bound(ai+1,ai+len+1,a[i].minn)-ai;
		a[i].xhmaxn=lower_bound(ai+1,ai+len+1,a[i].maxn)-ai;
		//cout<<a[i].minn<<" "<<a[i].maxn<<" "<<a[i].xhminn<<" "<<a[i].xhmaxn<<endl;
	}
	sort(a+1,a+n+1);
	int js=0; 
	for(int i=1;i<=n;i++){
		int s=a[i].xhminn,t=a[i].xhmaxn,flag=0;
		for(int j=s;j<=t;j++)if(vis[j]){
			flag=1;
			break;
		}
		if(flag==1)continue;
		for(int j=t;j>=s;j--){
			if(!vis[j]){
				vis[j]=1;
				++ans;
				flag=1;
				break;
			}
		}
		if(flag==1)continue;
		if(!flag)++js;
	}
	for(int i=1;i<=n;i++)if(!vis[i])++js;
	if(!js)cout<<ans;
	else cout<<"-1";                                                                                                                                                                      
	return 0;
}
//5 3 1 1 1 2 1 3 2 2 3 1

T3.COLOR A TREE UVA1205

UVA1205 Color a Tree - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

分析:想要染色最大的点(必须先染最大点才是最优解)必须先染它的父亲,所以把二者合并。设此节点为A,它父亲为B,另一个可以选择的点为C。因为A,B为捆绑关系,必须先选B,再选A,则共有两种选法。1.B,A,C:开销之和为b+2a+3c;2.C,B,A:开销之和为c+2b+3a。二者差为2c-(a+b)。我们要选择开销最小的方法,那么要比较2c-(a+b)即c-(a+b)/2与0的关系。所以,我们可以把(a+b)/2作为决定优先级的值,优先级值越大,在c不变的情况下,我们更应该先选大的优先级值。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1100;
int n,start,ans,vis[N];
struct node{
	int id,val,fa,last,next,size,sum;
}a[N];
struct nodei{
	int id;
	double num;
	bool operator <(const nodei &b)const{
		return num<b.num;
	}
};
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
} 

int main(){
	while(~scanf("%d%d",&n,&start)&&(n||start)){
		priority_queue<nodei>q;
		memset(a,0,sizeof(a));
		memset(vis,0,sizeof(vis));
		ans=0;
		for(int i=1;i<=n;i++){
			a[i].val=a[i].sum=read();
			a[i].id=a[i].last=i;
			a[i].size=1;
			if(i!=start)q.push((nodei){i,(double)a[i].val});
		}
		for(int i=1;i<n;i++){
			int u,v;
			u=read();v=read();
			a[v].fa=u;
		}
		while(!q.empty()){
			//cout<<"    case 1"<<endl;//
			nodei tmp=q.top();q.pop();
			int x=tmp.id;
			int f=a[x].fa;
			if(vis[x])continue;
			vis[x]=1;
			while(vis[f]&&f!=start)f=a[f].fa;
			a[a[f].last].next=x;
			a[f].last=a[x].last;
			a[f].sum+=a[x].sum;a[f].size+=a[x].size;
			double js=(double)a[f].sum/(double)a[f].size;
			if(f!=start)q.push((nodei){f,js});
		}
		for(int i=1,rt=start;i<=n;i++,rt=a[rt].next)ans+=i*a[rt].val;
		cout<<ans<<endl;
	}
	return 0;
}
 posted on 2021-07-06 21:28  eleveni  阅读(38)  评论(0)    收藏  举报