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
浙公网安备 33010602011771号