首页 > 其他分享 >P5690 [CSP-S2019 江西] 日期 &&P7909 [CSP-J 2021] 分糖果 &&P5657 [CSP-S2019] 格雷码

P5690 [CSP-S2019 江西] 日期 &&P7909 [CSP-J 2021] 分糖果 &&P5657 [CSP-S2019] 格雷码

时间:2024-10-18 17:21:55浏览次数:7  
标签:10 le 格雷 二进制 样例 && S2019 糖果 CSP

今天继续懒惰,继续三合一!!!

[CSP-S2019 江西] 日期

题目背景

CSP-SJX2019 T1

题目描述

Alice在纸上写下了一个日期,形式为 \(\text{MM-DD}\),其中 \(\text{MM}\) 与 \(\text{DD}\) 都是两位数字,分别表示月和天,然而这个日期并不一定存在。 Alice找来了Bob要他更改若干位上的数字,使得这个日期存在。请你帮Bob算算他最少需要更改几位数字。

本题中我们认为 \(2\) 月固定为 \(28\) 天。

输入格式

仅一行一个五个字符的字符串,表示 \(\text{MM-DD}\) 。

输出格式

仅一行一个整数,表示答案。

样例 #1

样例输入 #1

03-32

样例输出 #1

1

样例 #2

样例输入 #2

02-39

样例输出 #2

1

样例 #3

样例输入 #3

67-89

样例输出 #3

2

提示

【输入输出样例1说明】

更改方式不止一种,其中一种方式是改为: \(\text{03-22}\)。

【输入输出样例2说明】

一种更改方式为:\(\text{02-09}\)。

【输入输出样例3说明】

一种更改方式为:\(\text{07-09}\)。

【数据规模与约定】
对于 \(100\%\) 的数据:\(\text{MM}\) 与 \(\text{DD}\) 一定为 \(4\) 个数字。

update: 2024/07/04 增加 hack 一组

思路

这道题一看发现只要一吨if就可以直接做出来了,情况也不是太多

1.首先我们看日期,可以发现,只要改第一位就一定可以做对

2.日期也受月份的限制所以要判断大月、小月和二月

3.题里面并没有给数据,所以有可能有负数,保险加特判

综上所述,我们可以得到如下程序:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("date.in","r",stdin); 
	freopen("date.out","w",stdout);
	int d,m;
    scanf("%d-%d",&m,&d);
    if(d==29||d==30){
        if(m!=2&&m>0&&m<=12){
        	cout<<0;
        	return 0;
		}
        cout<<1;
        return 0;
    }
    if(d>0&&d<=28){
        if(m>0&&m<=12){
        	cout<<0;
        	return 0;
		}
        cout<<1;
        return 0;
    }
    if(d==31){
        if(m==2||m==4||m==6||m==9||m==11||m>=13&&m<=19){
        	cout<<1;
        	return 0;
		}
		if(m==1||m==3||m==5||m==7||m==8||m==10||m==12){
        	cout<<0;
        	return 0;
		}
        if(m%10==4||m%10==6||m%10==9){
        	cout<<2;
        	return 0;
		}
        cout<<1;
        return 0;
    }
    if(m==0||m>12){
    	cout<<2;
    	return 0;
	}
    cout<<1;
    return 0;
}

[CSP-J 2021] 分糖果

题目背景

红太阳幼儿园的小朋友们开始分糖果啦!

题目描述

红太阳幼儿园有 \(n\) 个小朋友,你是其中之一。保证 \(n \ge 2\)。

有一天你在幼儿园的后花园里发现无穷多颗糖果,你打算拿一些糖果回去分给幼儿园的小朋友们。

由于你只是个平平无奇的幼儿园小朋友,所以你的体力有限,至多只能拿 \(R\) 块糖回去。

但是拿的太少不够分的,所以你至少要拿 \(L\) 块糖回去。保证 \(n \le L \le R\)。

也就是说,如果你拿了 \(k\) 块糖,那么你需要保证 \(L \le k \le R\)。

如果你拿了 \(k\) 块糖,你将把这 \(k\) 块糖放到篮子里,并要求大家按照如下方案分糖果:只要篮子里有不少于 \(n\) 块糖果,幼儿园的所有 \(n\) 个小朋友(包括你自己)都从篮子中拿走恰好一块糖,直到篮子里的糖数量少于 \(n\) 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励

作为幼儿园高质量小朋友,你希望让作为你搬糖果的奖励的糖果数量(而不是你最后获得的总糖果数量!)尽可能多;因此你需要写一个程序,依次输入 \(n, L, R\),并输出你最多能获得多少作为你搬糖果的奖励的糖果数量。

输入格式

输入一行,包含三个正整数 \(n, L, R\),分别表示小朋友的个数、糖果数量的下界和上界。

输出格式

输出一行一个整数,表示你最多能获得的作为你搬糖果的奖励的糖果数量。

样例 #1

样例输入 #1

7 16 23

样例输出 #1

6

样例 #2

样例输入 #2

10 14 18

样例输出 #2

8

样例 #3

样例输入 #3

见附件中的 candy/candy3.in。

样例输出 #3

见附件中的 candy/candy3.ans。

提示

【样例解释 #1】

拿 \(k = 20\) 块糖放入篮子里。

篮子里现在糖果数 \(20 \ge n = 7\),因此所有小朋友获得一块糖;

篮子里现在糖果数变成 \(13 \ge n = 7\),因此所有小朋友获得一块糖;

篮子里现在糖果数变成 \(6 < n = 7\),因此这 \(6\) 块糖是作为你搬糖果的奖励

容易发现,你获得的作为你搬糖果的奖励的糖果数量不可能超过 \(6\) 块(不然,篮子里的糖果数量最后仍然不少于 \(n\),需要继续每个小朋友拿一块),因此答案是 \(6\)。

【样例解释 #2】

容易发现,当你拿的糖数量 \(k\) 满足 \(14 = L \le k \le R = 18\) 时,所有小朋友获得一块糖后,剩下的 \(k - 10\) 块糖总是作为你搬糖果的奖励的糖果数量,因此拿 \(k = 18\) 块是最优解,答案是 \(8\)。

【数据范围】

测试点 \(n \le\) \(R \le\) \(R - L \le\)
\(1\) \(2\) \(5\) \(5\)
\(2\) \(5\) \(10\) \(10\)
\(3\) \({10}^3\) \({10}^3\) \({10}^3\)
\(4\) \({10}^5\) \({10}^5\) \({10}^5\)
\(5\) \({10}^3\) \({10}^9\) \(0\)
\(6\) \({10}^3\) \({10}^9\) \({10}^3\)
\(7\) \({10}^5\) \({10}^9\) \({10}^5\)
\(8\) \({10}^9\) \({10}^9\) \({10}^9\)
\(9\) \({10}^9\) \({10}^9\) \({10}^9\)
\(10\) \({10}^9\) \({10}^9\) \({10}^9\)

对于所有数据,保证 \(2 \le n \le L \le R \le {10}^9\)。

【感谢 hack 数据提供】
wangbinfeng

暴力做法:

既然拿的糖是从l——r那么我们直接枚举每一个数然后找最大不就好了吗?

代码非满分,所有的没有展示的AC代码会每一段时间汇总发出

#include <bits/stdc++.h>
using namespace std;
int main(){
	freopen("candy.in","r",stdin); 
	freopen("candy.out","w",stdout);
	int ans=-0x7fffffff;
	int n,l,r;
	cin>>n>>l>>r;
	for(int i=l;i<=r;i++){
		ans=max(i%n,ans);
	}
	cout<<ans;
	return 0;
}

[CSP-S2019] 格雷码

题目描述

通常,人们习惯将所有 \(n\) 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。

格雷码(Gray Code)是一种特殊的 \(n\) 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻。

所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。

\(n\) 位格雷码不止一种,下面给出其中一种格雷码的生成算法:

  1. 1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。
  2. \(n + 1\) 位格雷码的前 \(2^n\) 个二进制串,可以由依此算法生成的 \(n\) 位格雷码(总共 \(2^n\) 个 \(n\) 位二进制串)按顺序排列,再在每个串前加一个前缀 0 构成。
  3. \(n + 1\) 位格雷码的后 \(2^n\) 个二进制串,可以由依此算法生成的 \(n\) 位格雷码(总共 \(2^n\) 个 \(n\) 位二进制串)按逆序排列,再在每个串前加一个前缀 1 构成。

综上,\(n + 1\) 位格雷码,由 \(n\) 位格雷码的 \(2^n\) 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 \(2^{n+1}\) 个二进制串。另外,对于 \(n\) 位格雷码中的 \(2^n\) 个 二进制串,我们按上述算法得到的排列顺序将它们从 \(0 \sim 2^n - 1\) 编号。

按该算法,2 位格雷码可以这样推出:

  1. 已知 1 位格雷码为 0,1。
  2. 前两个格雷码为 00,01。后两个格雷码为 11,10。合并得到 00,01,11,10,编号依次为 0 ~ 3。

同理,3 位格雷码可以这样推出:

  1. 已知 2 位格雷码为:00,01,11,10。
  2. 前四个格雷码为:000,001,011,010。后四个格雷码为:110,111,101,100。合并得到:000,001,011,010,110,111,101,100,编号依次为 0 ~ 7。

现在给出 \(n\),\(k\),请你求出按上述算法生成的 \(n\) 位格雷码中的 \(k\) 号二进制串。

输入格式

仅一行两个整数 \(n\),\(k\),意义见题目描述。

输出格式

仅一行一个 \(n\) 位二进制串表示答案。

样例 #1

样例输入 #1

2 3

样例输出 #1

10

样例 #2

样例输入 #2

3 5

样例输出 #2

111

样例 #3

样例输入 #3

44 1145141919810

样例输出 #3

00011000111111010000001001001000000001100011

提示

【样例 1 解释】

2 位格雷码为:00,01,11,10,编号从 0∼3,因此 3 号串是 10。

【样例 2 解释】

3 位格雷码为:000,001,011,010,110,111,101,100,编号从 0∼7,因此 5 号串是 111。

【数据范围】

对于 \(50\%\) 的数据:\(n \leq 10\)

对于 \(80\%\) 的数据:\(k \leq 5 \times 10^6\)

对于 \(95\%\) 的数据:\(k \leq 2^{63} - 1\)

对于 \(100\%\) 的数据:\(1 \leq n \leq 64\), \(0 \leq k \lt 2^n\)

思路

可以直接用搜索,暴力枚举,生成格雷码的方法:

根据题意,我们还可以发现:如果要求n位格雷码的第k个,那么k<2^n的一半,这一位就生成0,如果k>= 2^n的一半,就生成1

综上所述,我们可以得到如下程序:

#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
int n;
ll k;
void dfs(int x,ll y){
	if(x==1){
		cout<<y;
		return ;
	}
	long long half=pow(2,x-1);
	if(y<half){
		cout<<"0";
		dfs(x-1,y);
	}else if(k>=half){
		cout<<"1";
		long long a=y-half;
		dfs(x-1,half-1-a);
	}
}
int main(){
	cin>>n>>k;
	dfs(n,k);
	return 0; 
}

所有的没有展示的AC代码会每一段时间汇总发出

今天就到这里了,下次再见!

(不要问为什么不用德语或者写德语小课堂,问就是我是在学校的校本选修课上总结的,德语书不在身边)

嘻嘻

标签:10,le,格雷,二进制,样例,&&,S2019,糖果,CSP
From: https://www.cnblogs.com/wei-boke/p/18474699

相关文章

  • CSP-J模拟赛day6——试题
    全人杯奖金Description万人瞩目的第一届“全人杯”思维挑战赛正在紧锣密鼓的进行中,比赛的类别包括数学、物理和信息。为了激励同学们踊跃参与,比赛设置了一系列的奖项。对于每个学科,分别设置了一、二、三等奖以及鼓励奖和参与奖。其中,一等奖预设x名,奖金a元,二等奖预设y名,奖......
  • 2024 CSP-J/S2 模板复习计划
    2024CSP-J/S2模板复习计划(Starton2024-10-18)说明原来这个计划是2023CSP-J/S2模板复习,现在被拿来当模板集。Day1我的记录@zhenghanyun的记录任务已完成SPFA(不带负环)已完成Floyd已完成Dijkstra已完成拓扑排序已完成单调栈已......
  • [10.17]CSP模拟赛
    本场比赛中小L的std挂了样例,所以他需要唱歌~俗话说暴力要打满,但是暴力把数据范围打多了就一点不好了。赛前发现可以提前看题,但是昏昏欲睡的我决定先去睡觉。赛时睡醒了,开题。看到T1,一眼发现一种病毒要不把它所在的矩形全部删除,要不就不用管,所以很自然地想到预处理出每......
  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛08
    前言光顾着想T2了,但是不知道哪儿假了,只有\(\dfrac{n}{k}\le5\)的点是对的,然后居然只有二十分,发现数据放错了,找喵喵改了成五十了。然后T1因为重边挂没了。T3没调出来,确切的说是省的时间不多了打不完,就写了个部分分。T4咕了。机房凳子没靠椅,一直坐着腰快折了肿么办。......
  • CSP 模拟 49
    A传送(teleport)暴力连边一定不行,寻找最优的连边。先说下我的连法,手玩一下发现,如果对横坐标排序,点\(u\)只连下一个横坐标中与它纵坐标最近的即可,这样对于下一个横坐标的点,\(u\)的连法都是最优的,纵坐标同理。题解连法也一样,考虑本质就是在一维上走,所以两维排序后都连一下就......
  • 信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分
    PDF文档公众号回复关键字:202410171P8814[CSP-J2022]解密[题目描述]给定一个正整数k,有k次询问,每次给定三个正整数ni,ei,di,求两个正整数pi,qi,使ni=pi×qi、ei×di=(pi−1)(qi−1)+1[输入格式]第一行一个正整数k,表示有k次询问。接下来k行,第i行三个正整数......
  • 「闲话」CSP 集训记萌(二)
    10.17模拟赛相关模拟赛喜欢捏,之前只有过认为自己做法是正解结果不是的经历,这次T1、T2都认为自己做法不是正解结果却是。省流:T1Dij中的dis数组没赋极大值,不然A了,T2最经典放球问题推错式子,不然A了,应该都不算挂分,因为我是宋词开场Ratio:T1纯Dij板子啊,尝试一下7:30......
  • CSP2024 前做题情况
    10.12开始写,每天做的题都在这里了。AT_arc058_b考虑组合数。对于从\((1,1)\)走到\((n,m)\)的方案数,显然是\(C_{(n-1+1)+(m-1+1)-2}^{(n-1+1)-1/(m-1+1)-1}\)。那么考虑枚举一个行\(i(1\lei\len-a)\),我们需要从\((1,1)\)走到\((i,b)\)。这样能够使得我们的每一步都......
  • CSP-S2019
    括号树题意:给定一棵树,以\(1\)为根,每个点有字符(或)。定义\(s_i\)为\(i\)到根的路径的子串中合法括号序列的个数,求\(\bigoplus_{i=1}^ni\timess_i\),\(1\len\le5\times10^5\)。记\(p_i\)为\(i\)的父亲,\(a_i\)为\(i\)到根的路径以\(i\)结尾的合法括......
  • 10月16日 CSP-S
    T1小w的爱情密码【问题描述】小W终于鼓起勇气向小M表白,然而只是有勇气写情书。为了防止情书内容被同学窃取,小W给情书加密。小M的解密方式很简单,假设情书是字符串S1,小W给她的解密串是S2,小M会重复地完成“在S1中找到子串S2并删除”这一操作直到在S1中找不到S2。假如你是小M......