『一本通』贪心

活动安排

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,lst,ans;
 4 struct node{int l,r;}a[1005]; 
 5 bool cmp(node x1,node x2) {return x1.r<x2.r;}
 6 
 7 int main() {
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++) 
10      scanf("%d%d",&a[i].l,&a[i].r);
11     sort(a+1,a+n+1,cmp);
12     for(int i=1;i<=n;i++) 
13      if(lst<=a[i].l) ans++,lst=a[i].r;
14     printf("%d",ans);
15 }
16 //贪心(结束时间早的优先)

种树

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,h,ans;
 4 bool vis[30005];
 5 struct node{int b,e,t;}a[30005];
 6 bool cmp(node x1,node x2) {return x1.e<x2.e;}
 7 
 8 int main() {
 9     scanf("%d%d",&n,&h);
10     for(int i=1;i<=h;i++)
11      scanf("%d%d%d",&a[i].b,&a[i].e,&a[i].t);
12     sort(a+1,a+h+1,cmp);
13     for(int i=1;i<=h;i++) {
14         for(int j=a[i].b;j<=a[i].e;j++)
15          if(vis[j]) a[i].t--;
16         if(a[i].t<=0) continue;
17         ans+=a[i].t;
18         int tot=0;
19         for(int j=a[i].e;j>=a[i].b;j--) {
20             if(!vis[j]) tot++,vis[j]=1;
21             if(tot==a[i].t) break;
22         }
23     }
24     printf("%d",ans);
25 }
26 //贪心(在编号大的路段种树)

喷水装置

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int T,n,l,cnt,ans;
 4 double w;
 5 struct node{double l,r;}a[15005];
 6 inline int read() {
 7     int x=0; char c=getchar();
 8     while(c<'0'||c>'9') c=getchar();
 9     while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
10     return x;
11 }
12 bool cmp(node x1,node x2) {return x1.l<x2.l;}
13 
14 int main() {
15     T=read();
16     while(T--) {
17         cnt=ans=0;
18         n=read(),l=read(),w=read()/2.0;
19         for(int i=1;i<=n;i++) {
20             int x=read(); double r=read();
21             if(r<w) continue; 
22             r=sqrt(r*r-w*w); 
23             a[++cnt].l=x-r,a[cnt].r=x+r;
24         }
25         sort(a+1,a+cnt+1,cmp);
26         if(a[1].l>0) {printf("-1\n"); continue;}
27         int i=1; double rst=0; 
28         while(i<=cnt) {
29             double maxx=-1.0;
30             while(a[i].l<=rst&&i<=cnt) maxx=max(maxx,a[i++].r);
31             if(maxx>rst) {
32                 ans++,rst=maxx;
33                 if(rst>=l) break;
34             }else break;
35         }
36         if(rst<l) {printf("-1\n"); continue;}
37         printf("%d\n",ans);
38     }
39 }
40 //贪心(向右拓展能够浇灌的最右端点:rst)

猜你喜欢

转载自www.cnblogs.com/qq8260573/p/10236199.html