20201020

1. zdx看电影系列

排序,然后比较求出每个时间段可以看电影数量的最大值的,每一组数据得出答案后要将数组再次清零。

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=(x<<1)+(x<<3)+(ch^48);
   ch=getchar();
  }
  return x*f;
}
struct node {
	int num,s,e;
}a[1000005];
int t,k;
bool cmp1(node x,node y){
	return x.e<y.e;
}
int main(){
	t=read();
	while(t--){
		k=read();
		for(int i=1;i<=k;i++){
       a[i].num=read(),a[i].s=read(),a[i].e=read();
}
    sort(a+1,a+k+1,cmp1);
		int t1=a[1].e,ans=1;
		for(int i=2;i<=k;i++){
			if(a[i].s>=t1) ans++,t1=a[i].e;
}
    printf("%d\n",ans);
		for(int i=1;i<=k;i++){
       a[i].s=0,a[i].e=0;
	}
}
	return 0;
}

另一个只需要一组数据且不需要输入电影编号。

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=(x<<1)+(x<<3)+(ch^48);
   ch=getchar();
  }
  return x*f;
}
struct node {
	int s,e;
}a[1000005];
int t,k;
bool cmp1(node x,node y){
	return x.e<y.e;
}
int main(){
		k=read();
		for(int i=1;i<=k;i++){
       a[i].s=read(),a[i].e=read();
}
    sort(a+1,a+k+1,cmp1);
		int t1=a[1].e,ans=1;
		for(int i=2;i<=k;i++){
			if(a[i].s>=t1) ans++,t1=a[i].e;
}
    printf("%d\n",ans);
	return 0;
}

2.智力大闯关

只需要保证单位时间内所扣除的钱最少即可。(就是在尽可能后的位置去处理最大的惩罚)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define scy(x)   freopen(x".in","r",stdin);  freopen(x".out","w",stdout);
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=(x<<1)+(x<<3)+(ch^48);
    ch=getchar();
  }
  return x*f;
}
struct XX {
   int a,b;
 }a[100100];
 bool f[100100];
  bool cmp(const XX &x,const XX &y) {
     if (x.b>y.b) return(true);
      return(false);
     }
     int main() {
       int m,n,i,j,x;
       bool ff;
       m=read(); n=read();
        for (i=1; i<=n; i++) a[i].a=read();
        for (i=1; i<=n; i++) a[i].b=read();
         sort(a+1,a+n+1,cmp);
         x=n;
          memset(f,true,sizeof(f));
           for (i=1; i<=n; i++)
           if (f[a[i].a]==true) {
             f[a[i].a]=false;
           } else {
              ff=false;
              for (j=a[i].a; j>=1; j--) {
                 if (f[j]) {
                    f[j]=false; ff=true;
                     break;
                    }
                   }
                    if (ff==false) {
                       m-=a[i].b;
                       f[x]=false;
                        x--;
                       }
                      }
                  printf("%d",m);
                       return 0;
                     }

3.整数区间

  • 把区间先按右端点从小到大排序,开两个变量来记录位置(保证x < y)
    *如果区间右端点大于y,则这个区间至少有两个数被放进集合中了,continue掉就好了
    *如果区间的右端点在x和y之间,把x变成y,y变成这个区间的左端点,同时ans++
    *如果区间的右端点小于x,x变成区间的左端点,y变成区间的右端点,同时ans+=2
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
  while(ch>='0'&&ch<='9'){
    x=(x<<1)+(x<<3)+(ch^48);
   ch=getchar();
  }
  return x*f;
}
struct node{
    int a;
    int b;
}m[1000];
bool cmp(node a,node b){
    if(a.a != b.a)
    {
        return a.a < b.a;
    }
    else
    return a.b < b.b;
}
int main(){
    int n,f1,f2,tot = 0;
  n=read();
    for(int i = 1;i <= n;i++)
    {
        m[i].a=read(),m[i].b=read();
    }
    sort(m + 1,m + n + 1,cmp);
    f1 = m[n].a;
    f2 = m[n].a + 1;
    tot += 2;
    for(int i = n - 1;i > 0;i--){
        if(m[i].b < f1){
            tot += 2;
            f1 = m[i].a;
            f2 = f1 + 1;
        }
        else if(m[i].b < f2){
            tot ++;
            f2 = f1;
            f1 = m[i].a;
        }
    }
    printf("%d",tot);
    return 0;
}

4.雷达安装

以每个点为圆心,d为半径做圆,每个点可以在x轴上得到一个区间,这样就转换成了在x轴上选点,使得每个区间内都至少有一个点。
我们按照右端点排序,如果下一个区间的右端点在前一个里面,我们可以跳过,否则我们就选择右端点最旁边的那个点(也就是那个点),显然这样更优。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
inline int read(){
  int x=0,f=1;
  char ch=getchar();
  while(ch>'9'||ch<'0'){
    if(ch=='-') f=-1;
    ch=getchar();
  }
    while(ch>='0'&&ch<='9'){
      x=(x<<1)+(x<<3)+(ch^48);
      ch=getchar();
    }
    return x*f;
  }

const int maxn=1e3+7;
int n,m,ans,d,x[maxn],y[maxn];
double l[maxn],r[maxn],temp;

struct node {
  double l,r;
}a[maxn];

  double cmp(node a,node b){
    return a.r<b.r;
  }

int main(){
    n=read(),d=read();
    for(int i=1;i<=n;i++){
      x[i]=read(),y[i]=read();
    }
    for(int i=1;i<=n;i++){
      a[i].l=x[i]-sqrt(d*d-y[i]*y[i]);
      a[i].r=x[i]+sqrt(d*d-y[i]*y[i]);
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++){
      if(i==1){
        temp=a[i].r;
        ans++;
      }else{
        if(temp>=a[i].l) continue;
        else ans++;
        temp=a[i].r;
      }
    }
  printf("%d",ans);
  return 0;
}

posted on 2020-10-20 16:44  fishsit  阅读(82)  评论(0编辑  收藏  举报

导航