牛客小白月赛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) 后缀优化+二分

相关推荐
凌肖战11 分钟前
力扣上刷题之C语言实现(数组)
c语言·算法·leetcode
编程版小新11 分钟前
C++初阶:STL详解(四)——vector迭代器失效问题
开发语言·c++·迭代器·vector·迭代器失效
秋夫人37 分钟前
B+树(B+TREE)索引
数据结构·算法
代码雕刻家1 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
梦想科研社1 小时前
【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)
开发语言·算法·数学建模·matlab·无人机
Milo_K1 小时前
今日 leetCode 15.三数之和
算法·leetcode
Darling_001 小时前
LeetCode_sql_day28(1767.寻找没有被执行的任务对)
sql·算法·leetcode
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
Greyplayground1 小时前
【算法基础实验】图论-BellmanFord最短路径
算法·图论·最短路径
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode