• Codeforces 1283E New Year Parties


    题目链接:

    Codeforces 1283E New Year Parties

    思路:

    1.求最小:如果一个房子有人,那么包含它的连续三个房子至少有一个人,那么采用贪心思想,从前往后扫,如果房子有人,那么就判定连着的三个房子有一个人;
    2.求最大:一段长为n的连续有人区间,如果总人数为n+1,那么这段区间可以向左给出一个人,如果总人数大于n+1,则又可以向右给出一个人;那我们采用贪心思想,从前往后扫整个区间(注意整个区间范围),如果该房子没有人且前面房子有人,则我们将前面一个房子移一个人过来,如果当前区间有大于一个人,则往后移;

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int maxn=2e5+5;
    int n,a[maxn];
    
    int main(){
    	scanf("%d",&n);
    	for(int i=0;i<n;i++){
    		int x; scanf("%d",&x); ++a[x];
    	}
    	int ans1=0,ans2=0;
    	for(int i=1;i<=n;i++) if(a[i]) ++ans1,i+=2;
    	for(int i=0;i<=n;i++){    //pay attention the section is [0,n+1]
    		if(a[i]==0&&a[i+1]) ++a[i],--a[i+1];
    		else if(a[i]>=2) --a[i],++a[i+1];
    	}
    	for(int i=0;i<=n+1;i++) if(a[i]) ++ans2;
    	printf("%d %d",ans1,ans2);
    	return 0;
    }
    
  • 相关阅读:
    C# 通过反射初探ORM框架的实现原理
    Redis-Nosql数据库入门
    HTTPS 建立连接的详细过程
    Spring面试题
    struts2面试整理
    Java面试基本知识
    Spring MVC面试整理
    Mybatis面试整理
    Sublime 正则替换
    Hiberante知识点梳理
  • 原文地址:https://www.cnblogs.com/yuhan-blog/p/12308704.html
Copyright © 2020-2023  润新知