首页 > 其他分享 >Living-Dream 系列笔记 第1期

Living-Dream 系列笔记 第1期

时间:2024-03-09 12:55:06浏览次数:24  
标签:Living 10 int 31 30 笔记 ++ && Dream

本期主要讲解模拟、枚举算法。

例题

T1

简单模拟题。

利用 scanf/cinint 形式读入分和秒,并令秒循环累加,逢 \(60\) 归 \(0\) 并向分进 \(1\),分则是逢 \(24\) 归 \(0\)。

在循环的过程中若分秒合起来是回文数字,则退出循环,按照题目格式输出当前时间。

注意开始时间不算。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int h,m; char c;
    cin>>h>>c>>m;
    while(1){
        m++;
        if(m==60) m=0,h++;
        if(h==24) h=0;
        
        if(h/10==m%10&&h%10==m/10) break;
    }
    if(h<10) cout<<0; cout<<h<<':';
    if(m<10) cout<<0; cout<<m;
}

T2

将这个八位数按字符串读入,然后分离出年、月、日。

接着按照上一题的方法,将日期不断累加,这里可以打一个表记录每月天数,当日期大于此月天数就归 \(0\) 并向月份进 \(1\),需要特判二月;月份是逢 \(12\) 归 \(0\) 并向年份进 \(1\),年份则不用进位。

在循环过程中,若当前年月日为回文数,则输出当前年月日,此时不可 break;若当前年份 \(1,2\) 位和 \(3,4\) 位相同,且 \(1\)、\(2\) 位不同(即当前年月日为 ABABBABA 形式),则输出当前年月日并退出循环。输出时仍按上一题的格式来。

#include<bits/stdc++.h>
using namespace std;

int y,m,d;
int cnt;
int day[]={-1,31,-1,31,30,31,30,31,31,30,31,30,31};
string s;

int main(){
	cin>>s;
	y=(s[0]-'0')*1000+(s[1]-'0')*100+(s[2]-'0')*10+(s[3]-'0');
	m=(s[4]-'0')*10+(s[5]-'0');
	d=(s[6]-'0')*10+(s[7]-'0');
	
	while(1){
		d++;
		if(m==2){
			if(y%4==0&&y%100!=0||y%400==0) day[2]=29;
			else day[2]=28;
		}
		if(d>day[m]) m++,d=0;
		if(m>12) m=0,y++;
		
		if(y/1000==d%10&&y/100%10==d/10&&y/10%10==m%10&&y%10==m/10){
			if(cnt==0){
				cout<<y;
				if(m<10) cout<<0; cout<<m;
				if(d<10) cout<<0; cout<<d;
				cout<<'\n';
				cnt++;
			}
			
			if(cnt==1){
				int a=y/100,b=y%100;
				if(a==b&&a/10!=a%10){
					cout<<y;
					if(m<10) cout<<0; cout<<m;
					if(d<10) cout<<0; cout<<d;
					cout<<'\n';
					break;
				}
			}
		}
	}
	return 0;
}

另:我们老师的思路是按 int 整型读入 \(n\),并不断累加 \(n\),若它是合法日期且是回文数 / ABABBABA 形式,则输出。

T3

典题。

从 \(date_1\) 循环至 \(date_2\),依次检查是否为合法日期且为回文日期,若是则输出。

#include<bits/stdc++.h>
using namespace std;

int d1,d2,ans;
int day[]={-1,31,-1,31,30,31,30,31,31,30,31,30,31};

bool isdate(int x){
	int m=x/100%100,d=x%100;
	if(m==2){
		int y=x/10000;
		if(y%4==0&&y%100!=0||y%400==0) day[m]=29;
		else day[m]=28;
	}
	return m>=1&&m<=12&&d>=1&&d<=day[m];
}
bool check(int x){
	int y=0,tmp=x;
	while(tmp){
		y=y*10+tmp%10;
		tmp/=10;
	}
	return x==y;
}

int main(){
	cin>>d1>>d2;
	for(int i=d1;i<=d2;i++)
		if(isdate(i)&&check(i)) ans++;
	cout<<ans;
	return 0;
}

T4

虽然上课没讲,但还是说一下。

其实只需要写一个进制转换函数,对 \([1,300]\) 的数依次进行转换,并判断它们是否为回文数即可。

#include<bits/stdc++.h>
using namespace std;

int b;

bool check(string s){
	string x; int l=s.length();
	for(int i=l-1;i>=0;i--) x+=s[i];
	for(int i=0;i<l;i++)
		if(s[i]!=x[i]) return false;
	return true;
}
string trans(int x){
	string s="",ss="";
	while(x){
		if(x%b>9) s+=(char)(x%b-10+'A');
		else s+=(char)(x%b+'0');
		x/=b;
	}
	int l=s.length();
	for(int i=l-1;i>=0;i--) ss+=s[i];
	return ss;
}

int main(){
	cin>>b;
	for(int i=1;i<=300;i++)
		if(check(trans(i*i))) cout<<trans(i)<<' '<<trans(i*i)<<'\n';
	return 0;
}

习题

T5

首先筛出 \(2 \sim n\) 中的所有质数,因为 \(n\) 范围很小,所以连试除法都可以过。我使用的是埃氏筛,老师说可以从 \(i \times i\) 开始标记。

接着 \(O(n^2)\) 地枚举一对质数 \(p_i\) 与 \(p_j\),若 \(p_i = p_j + p_{j - 1} + 1\),则令计数器 \(cnt \gets cnt + 1\)。需要注意,若你和我的判断式子一样,则 \(j\) 需要从 \(2\) 开始。

最后,若 \(cnt \ge k\),则输出 YES,反之输出 NO

#include<bits/stdc++.h>
using namespace std;

int n,k,tot,ans;
bool f[1031];
int p[1031];

void Esh(){
	for(int i=2;i<=n;i++){
		if(!f[i]){
			p[++tot]=i;
			for(int j=i*i;j<=n;j+=i) f[j]=true;
		}
	}
}

int main(){
	cin>>n>>k;
	Esh();
	for(int i=1;i<=tot;i++)
		for(int j=2;j<i;j++)
			if(p[i]==p[j]+p[j-1]+1)
				ans++;
	cout<<(ans>=k?"YES":"NO");
	return 0;
}

T6

字符串题。

读入四行字符串,统计每个字母出现的次数,存入 \(ch\) 数组,记次数最多的字母出现的次数为 \(x\)。

从 \(x\) 循环至 \(1\),遍历 \(ch\) 数组,若当前字母的出现次数 \(\ge\) 行数,则输出 * \(+\) 一个空格,是最后一行则输出 *;若当前字母出现 \(0\) 次,则输出两个空格,是最后一行则输出一个空格。

在最后一行下方需要输出 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

#include<bits/stdc++.h>
using namespace std;

string t;
int ch[31],x;

int main(){
    getline(cin,t); for(int i=0;t[i];i++) if(isupper(t[i])) ch[t[i]-'A'+1]++;
    getline(cin,t); for(int i=0;t[i];i++) if(isupper(t[i])) ch[t[i]-'A'+1]++;
    getline(cin,t); for(int i=0;t[i];i++) if(isupper(t[i])) ch[t[i]-'A'+1]++;
    getline(cin,t); for(int i=0;t[i];i++) if(isupper(t[i])) ch[t[i]-'A'+1]++;
    for(int i=1;i<=26;i++) x=max(x,ch[i]); 

    
    for(int i=x;i>=1;i--){
        for(int j=1;j<=26;j++){
            if(ch[j]>=i){
                if(j<26) cout<<"* ";
                else cout<<"*";
            }
            else{
                if(j<26) cout<<"  ";
                else cout<<" ";
            }
        }
        cout<<"\n";
    }
    cout<<"A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
    return 0;
}

标签:Living,10,int,31,30,笔记,++,&&,Dream
From: https://www.cnblogs.com/XOF-0-0/p/18062550

相关文章

  • Living-Dream 系列笔记 第17期
    ProblemT1/*思路:分类讨论:若k=0,则输出x+1;若k>tot(x的位数),则输出1+k-tot个0+x;否则输出10^k+x。*/#include<bits/stdc++.h>usingnamespacestd;longlongk,x,tot,ans=1;//开longlongintmain(){ cin>>k>>x; if(k==0){cout<<x+1;return0;}//情况1......
  • Living-Dream 系列笔记 第14期
    本期主要讲解差分技巧。知识点我们令原数组为\(a_i\),则当且仅当\(d_i=a_i-a_{i-1}\)时,我们称\(d_i\)是\(a_i\)的差分数组。特别的,\(d_1=0\),\(d_{n+1}=-n\)。差分数组\(d_i\)有以下三个性质:\(d_i\)的前缀和数组为\(a_i\)。将\(a_{L\simR}\)这个区间统一加......
  • Living-Dream 系列笔记 第15期
    模拟赛爆炸祭。T1把所有连通块依次求出,若某个连通块的数量已经出现过,则说明它与以前的连通块属于同一星系,直接将星系大小加上连通块大小并取\(\max\);否则将星系数量\(+1\)。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,m;intans=-1e9,num,......
  • Living-Dream 系列笔记 第11期
    本期主要讲解与上期相同内容(雾。例题T1在整个矩阵外加一圈\(0\),使得包围圈外的\(0\)形成一整个连通块。求出这个连通块并标记为\(1\),然后输出即可。#include<bits/stdc++.h>usingnamespacestd;intn;intdx[]={-1,0,1,0},dy[]={0,1,0,-1};inta[31][31],g[31][31];......
  • Living-Dream 系列笔记 第12期
    本期主要讲解一维前缀和技巧。知识点我们令\(a_i\)表示原数组的第\(i\)个元素,则\(sum_i\)表示\(a_i\)前\(i\)个元素之和,即:\[sum_i=\sum^{i}_{j=1}a_j\]我们知道,\(a\)数组前\(i\)个元素的和\(=\)前\(i-1\)个元素的和\(+a_i\)。于是便可得到\(sum\)数组的......
  • Living-Dream 系列笔记 第13期
    本期主要讲解二维前缀和。知识点我们令\(a_{i,j}\)表示原数组,则\(sum_{i,j}\)为\(a\)的二维前缀和数组。根据容斥原理,得到递推式:\[sum_{i,j}=sum_{i-1,j}+sum_{i,j-1}-sum_{i-1,j-1}+a_{i,j}\]二维前缀和适用于求静态矩阵的子矩阵元素和。若我需要求一个左上角坐标为......
  • Living-Dream 系列笔记 第10期
    本期主要讲解进阶\(\text{DFS}\)。知识点\(\text{DFS}\)求解连通块问题:定义:若一个点集中的所有点都能互达,且与集合外的点无法互达,则称此点集为一个连通块。考查方式:求连通块数量/大小/周长。例题T1在\(\text{DFS}\)函数中传入参数\(x\)和\(str\),分别表示......
  • Living-Dream 系列笔记 第8期
    本期主要讲解的与上期相同。例题T1上课的时候调这个题感觉要吐了\(qwq\)。。。首先读入\(n\)行字符串,可以采取忽略中间无关单词的方式来直接读取\(X\)和\(Y\)。将所有名字存入\(a\)数组,对\(a\)数组按字典序排序后就可以开始\(\text{DFS}\)了,这里建议使用next_pr......
  • Living-Dream 系列笔记 第9期
    模拟赛掉大分(悲T1板子,不讲。T2首先很明显这题是个去重全排列。和模板的区别就是加了一个\(sum\)参数记录目前已经放了几个苹果。当\(x=n+1\)时若\(sum=m\),则更新答案。同时加入一个剪枝:若在搜索过程中\(sum>m\),则直接return结束搜索。#include<bits/stdc++.h>usi......
  • Living-Dream 系列笔记 第6期
    模拟赛。寄。T1对于每次询问,二分查找数组中对应值的原下标即可,因此需要用结构体存储原始数据和原始下标。这当然是比较麻烦的做法。另一种做法则是开一个map替代桶来存储数组中每个元素的下标,对于每个询问输出即可。另外值得注意的是,本题默认询问之间相互独立。时间复杂度......