牛客小白月赛80 A-D

时间原因 快速水了A------D

A、

题目描述

现在给你一个递推公式:

n=0 an=1 ; n=1 an=2 ;n>1 an=2*a(n-1)-a(n-2)

求该数列的第 n 项。由于答案可能过大,你只需要输出答案对 998244353 取模后的值。

输入描述:

复制代码
一个正整数 n (1≤n≤998244351) 。

输出描述:

复制代码
一个整数,对应答案。

示例1

输入

复制代码
1

输出

复制代码
2

示例2

输入

复制代码
2

输出

复制代码
3

备注:

复制代码
如果没有解题思路,可以算一下前几项看看。
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
const int N=2e5+10;
const int mod=1e9+7;
const double eps=1e-5;
typedef double db;
int n;
signed main()
{
    cin>>n;
	cout<<n+1<<"\n";
	
	return 0;
} 

B、

题目描述

校园里目前有 N 名学生,这些学生属于 M 个班级。第 i 个人属于第Ai​ 个班级。突然,放学铃声响起,你还没来得及思索,就已经有 K 名学生已经冲出了学校。你不知道已经跑出学校的学生属于哪些班级,但是,你想知道,目前还没出校的学生中,最多有多少学生是属于同一个班级的。

输入描述:

复制代码
第一行三个正整数 N (1≤N≤10^5), M(1≤M≤N),K(1≤K≤N)含义如上所述。

第二行 N 个正整数 Ai​(1≤Ai≤M),含义如上所述。

输出描述:

复制代码
一个整数,表示目前学校里最多有多少同学是属于同一个班级的。

示例1

输入

复制代码
6 3 3
3 1 2 3 3 2

输出

复制代码
3
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
const int N=2e5+10;
const int mod=1e9+7;
const double eps=1e-5;
typedef double db;
int n,m,k;
int a[N];
int cnt[N];
signed main()
{
	int mmax=0;
	
    cin>>n>>m>>k;
	
	fp(i,1,n)cin>>a[i],cnt[a[i]]++,mmax=max(mmax,a[i]);
	
    sort(cnt+1,cnt+1+mmax);
	
	int sum=0;
	for(int i=1;i<=mmax-1;i++)
	{
		sum+=cnt[i];
	}	
	if(sum>=k)
	{
		cout<<cnt[mmax];
	}
	else
	{
		cout<<cnt[mmax]-(k-sum);
	}
	
	return 0;
} 

C、

题目描述

本题和 D 题的唯一区别是 N 的范围。

校园里目前有 N 名学生,这些学生属于 M 个班级。第 i(i=1,2,...,N)个人属于第Ai​ 个班级。突然,放学铃声响起,你还没来得及思索,就已经有 K 名学生已经冲出了学校。然而,由于某班级的老师还在拖堂,可以确定这个班级目前还没有任何学生离校。现在请你求出,假设恰好只有班级 j(j=1,2,...,M)的老师还在拖堂,在剩下的未拖堂的班级中,还留在学校的人数最多的班级的最少的可能人数是多少。

输入描述:

复制代码
第一行三个正整数 N(1≤N≤10^2),M(1≤M≤N),K(1≤K≤N)含义如上所述。
第二行 N个正整数 Ai​(1≤Ai≤M),含义如上所述。

输出描述:

复制代码
M个整数,第 i 个整数表示恰好只有班级 i 的老师还在拖堂,在剩下的未拖堂的班级中,还留在学校的人数最多的班级的最少的可能人数是多少。如果班级 i 拖堂就不可能有 K 名学生冲出学校,则输出 -1。

示例1

输入

复制代码
6 3 3
3 1 2 3 3 2

输出

复制代码
1 1 0

示例2

输入

复制代码
6 3 4
3 1 2 3 3 2

输出

复制代码
1 0 -1
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
const int N=2e5+10;
const int mod=1e9+7;
const double eps=1e-5;
typedef double db;
int n,m,k;
int a[N];
int cnt[N];
int cnts[N];
signed main()
{
	
    cin>>n>>m>>k; 
	
	fp(i,1,n)cin>>a[i],cnt[a[i]]++;
	
	
	for(int i=1;i<=m;i++)
	{
	    if(n-cnt[i]<k)
	    {
	    	cout<<-1<<" ";
	    	continue;
		}
		for(int j=0;j<=n;j++)
		{
		    int sum=0;
			for(int t=1;t<=m;t++)
			{
				if(t==i)continue;
				sum+=max(0ll,cnt[t]-j);
			}
			if(sum<=k)
			{
			    cout<<j<<" ";
				break;	
			} 	
	    }
	}
	
	return 0;
} 

O(n^3)暴力

D、

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define fp(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
const int N=2e6+10;
const int mod=1e9+7;
const double eps=1e-5;
typedef double db;
int n,m,k;
int a[N];
int sum1[N],sum2[N];
int calc(int x,int i){
    return (sum2[x]-(a[i]>=x)*a[i])-(sum1[x]-(a[i]>=x))*x;
}
signed main()
{
	
    cin>>n>>m>>k; 
	
	int x;
	for(int i=1;i<=n;i++)cin>>x,a[x]++;
    for(int i=1;i<=m;i++)
        sum1[a[i]]++,sum2[a[i]]+=a[i];
    for(int i=n-1;i>=0;i--)sum1[i]+=sum1[i+1],sum2[i]+=sum2[i+1];
    for(int i=1;i<=m;i++){
        if(n-a[i]<k){
            cout<<-1<<" ";
            continue;
        }
        int l=0,r=n;
        while(l<r){
            int mid=(l+r)>>1;
            if(calc(mid,i)<=k)r=mid;
            else l=mid+1;
        }
        cout<<l<<" ";
    }
	return 0;
} 

O(nlogn) 后缀优化+二分

相关推荐
火云洞红孩儿24 分钟前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
一只码代码的章鱼30 分钟前
排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
数据结构·算法·排序算法
青い月の魔女1 小时前
数据结构初阶---二叉树
c语言·数据结构·笔记·学习·算法
我要出家当道士1 小时前
Nginx单向链表 ngx_list_t
数据结构·nginx·链表·c
林的快手2 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
FeboReigns2 小时前
C++简明教程(4)(Hello World)
c语言·c++
FeboReigns2 小时前
C++简明教程(10)(初识类)
c语言·开发语言·c++
千天夜2 小时前
多源多点路径规划:基于启发式动态生成树算法的实现
算法·机器学习·动态规划
zh路西法2 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
从以前2 小时前
准备考试:解决大学入学考试问题
数据结构·python·算法