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

Living-Dream 系列笔记 第18期

时间:2024-03-03 18:44:17浏览次数:16  
标签:Living int 18 31 字符串 using include Dream size

Problem

T1

/*
思路:令N个整数以字符串形式读入,
判断其末尾是否为0、2、4、6、8,若是则为偶数,不是则为奇数。
*/
#include<bits/stdc++.h>
using namespace std;

int n;
string x; //以字符串形式读入

int main(){
	cin>>n;
	while(n--){
		cin>>x;
		if(x[x.size()-1]=='0'||x[x.size()-1]=='2'||x[x.size()-1]=='4'||x[x.size()-1]=='6'||x[x.size()-1]=='8') cout<<"even\n"; //判断末尾
		else cout<<"odd\n";
	}
	return 0;
}

T2

/*
思路:为了使组成的数最大,则需要使这个数的为数最多;
因此我们尽量采用使用木棍最少的数1来组成数字;
但1需要两根木棍,若n为奇数时全用1是不行的;
所以我们需要在n为奇数时是用木棍次少的7来开头。
*/
#include<bits/stdc++.h>
using namespace std;
int n;
int main(){
    cin>>n;
    if(n%2==1) cout<<7,n-=3; //特判
    while(n) cout<<1,n-=2; //连续输出1
    return 0;
}

T3

/*
思路:不难发现答案只有可能在0~3之间(因为最少切0刀,最多为每人切一刀);
因此考虑分类讨论:
切0刀:仅当a,b,c仅有1个非0时。
切1刀:仅当a,b,c有2个非0且这两个数相等时。
切2刀:仅当a,b,c有2个非0且这两个数不相等,或者a,b,c中有两个数相等,又或者a,b,c中两数之和等于另一个数时。
切3刀:其他情况均切3刀。
*/
#include<bits/stdc++.h>
using namespace std;

int T,a[3];

int main(){
	cin>>T;
	while(T--){
		int t=0; //a,b,c中0的个数
		for(int i=0;i<3;i++)
			cin>>a[i],t+=(!a[i]);
		sort(a,a+3); //排序
		if(t==2) cout<<"0\n"; //切0刀
		else if(t==1&&a[1]==a[2]) cout<<"1\n"; //切1刀
		else if(t==1||a[1]==a[2]||a[0]+a[1]==a[2]||a[0]==a[1]) cout<<"2\n"; //切2刀
		else cout<<"3\n"; //切3刀
	}
	return 0;
}

T4

/*
思路:我们进行四次旋转,
把每次旋转后的邮票看作新的邮票,放入画布进行涂色,
对四种邮票都涂完色后判断画布与目标是否一致即可。
*/
#include<bits/stdc++.h>
using namespace std;

int T,n,k;
char a[31][31],b[31][31],c[31][31],t[31][31];

void rotate(){ //顺时针90度旋转
    for(int i=1;i<=k;i++)
    	for(int j=1;j<=k;j++)
    		t[i][j]=b[k-j+1][i];
    for(int i=1;i<=k;i++)
    	for(int j=1;j<=k;j++)
    		b[i][j]=t[i][j];
}
bool check(){ //判断c画布与目标是否一致
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(a[i][j]=='*'&&c[i][j]!='*')
                return 0;
    return 1;
}
void paint(int x,int y){ //涂色
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            if(a[x+i-1][y+j-1]=='.'&&b[i][j]=='*') //若目标是'.'而邮票是'*',则无法涂色
                return;
    
    for(int i=1;i<=k;i++) //对c画布进行染色
        for(int j=1;j<=k;j++)
            if(b[i][j]=='*')
                c[x+i-1][y+j-1]=b[i][j];
}

string work(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j],c[i][j]='.'; //需要清空c画布
    cin>>k;
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            cin>>b[i][j];
    
    for(int i=1;i<=4;i++){
        rotate(); //进行4次旋转
        for(int i=1;i+k-1<=n;i++)
            for(int j=1;j+k-1<=n;j++)
                paint(i,j); //枚举左上角进行涂色
    }
    
    return check()?"YES":"NO"; //根据比对情况返回结果
}

int main(){
    cin>>T;
    while(T--) cout<<work()<<'\n';
    return 0;
}

T5

/*
思路:将4个立方体看作4个格子,进行dfs搜索;
在搜索过程中记录参数s,表示目前选择的字符所拼接成的字符串;
每次dfs之前先进行更新,循环目标字符串数组,
若s==当前目标字符串,则标记;
接着循环4个立方体,若当前的未被访问过,则标记,
并且循环6个面,令s加上当前字符进行下一层搜索;
最后循环目标字符串数组,若当前字符串已被标记,则输出YES,反之输出NO。
*/
#include<bits/stdc++.h>
using namespace std;

int n;
bool ans[31],vis[31];
char a[31][31];
string s[31];

void update(string x){
	for(int i=1;i<=n;i++)
		if(x==s[i]) ans[i]=1; //标记答案数组
}

void dfs(int x,string ss){
	update(ss); //更新
	if(x==5) return; //填完了
	for(int i=1;i<=4;i++){ //循环4个立方体
		if(!vis[i]){ //未被标记
			for(int j=1;j<=6;j++){ //循环6个面
				vis[i]=1; //标记
				dfs(x+1,ss+a[i][j]); //下一层搜索
				vis[i]=0; //回溯
			}
		}
	}
}

int main(){
	cin>>n;
	for(int i=1;i<=4;i++)
		for(int j=1;j<=6;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++) cin>>s[i];
	dfs(1,"");
	for(int i=1;i<=n;i++){
		if(ans[i]) cout<<"YES\n";
		else cout<<"NO\n";
	}
	return 0;
}

标签:Living,int,18,31,字符串,using,include,Dream,size
From: https://www.cnblogs.com/XOF-0-0/p/18050468

相关文章

  • Living-Dream 系列笔记 第20期
    ProblemT1/*思路:统计每个人成绩的出现人次,然后贪心地按分数值域从大到小扫描一遍,每次令答案累加上当前分数出现的人次,若答案>=k就停止扫描并输出即可。*/#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,k,a[2031];intcnt,ans;intmp[131......
  • CF1833G Ksyusha and Chinchilla 题解
    首先,若\(n\bmod3\neq0\),则一定无解。考虑\(n\bmod3=0\)的情形:首先肯定是先进行一遍树形dp,求出树上每个节点\(x\)的子树大小\(size_x\)。若当前节点的\(size\)值\(=3\),则说明需要切断当前节点于其父节点的连边,使得其子树成为一个大小为\(3\)的单独连通块。......
  • AT_abc184_f [ABC184F] Programming Contest 题解
    题目传送门前置知识Meetinthemiddle解法非正解当成超大背包来做,暴力枚举每个数是否进行相加。时间复杂度为\(O(2^{n})\)。llp[50],ans=0;voiddfs(llx,lln,llm,llworth){ if(x==n+1) { if(worth<=m) { ans=max(ans,worth); } } else { if(wo......
  • 力扣118.杨辉三角
    题目:给定一个非负整数numRows,生成「杨辉三角」的前numRows行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。实现方法:从第三行开始,通过循环,依次求取上一行相邻两数的和,添加到结果里。funcgenerate(numRowsint)[][]int{ varr[][]int fori:=0;i<nu......
  • 洛谷题单指南-二分查找与二分答案-P1182 数列分段 Section II
    原题链接:https://www.luogu.com.cn/problem/P1182题意解读:每段和的最大值越小,则分段数就越多,因此可以通过给定每段和的最大值,将分段数划分为两类:<=M,>M,对每段和的最大值进行二分即可。解题思路:二分的判定条件为,给定每段和的最大值,计算分段数,计算逻辑如下:依次遍历每一个数,求当前......
  • P9184 [USACO23OPEN] Moo Language B 题解
    恶♂趣♂味♂大♂模♂拟♂。首先是构造语句部分:开始肯定是尽可能地多用上不及物语句和及物语句;接着,因为及物语句的单词数量一定比不及物语句多,所以贪心地尽可能多地将不及物语句改为及物语句;然后,为了增加语句长度,再次贪心地在及物语句中尽可能多地添加名词和逗号即可。......
  • CF1856E1 PermuTree (easy version) 题解
    假定当前在节点\(u\),它拥有两棵子树\(v,w\),此时\(u\)是\(\operatorname{lca}(v,w)\)。我们一定可以构造出一个排列\(a\),使得所有满足\(i\inv\)的节点\(i\)和满足\(j\inw\)的节点\(j\),有\(a_i<a_u<a_j\)。因此此时点\(u\)对于答案的贡献即为\(size_v\times......
  • Living-Dream 系列笔记 第34期
    T1有一个比较秒的trick:虚拟点。对于本题,我们设一虚拟点\(n+1\)表示水源,于是打井的操作即为与点\(n+1\)连边,将点权转为边权。然后跑kruskal即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,tot;intfa[331];intw[331];intp[331]......
  • Living-Dream 系列笔记 第33期
    Living-Dream系列笔记强势回归(雾)T1并查集妙妙题。很容易想到一种朴素的贪心策略:对于所以物品按照价格从大到小排序,然后每一个物品,找到最晚的没有卖物品的那一天卖掉此物品。这样贪心的时间复杂度为\(O(\maxd_i\timesn)\),可以通过。考虑如何优化此贪心。可以发现朴素......
  • P9183 [USACO23OPEN] FEB B 题解
    由于只需要考虑相邻的位置,所以每一段连续的F是互不影响的,可以分别进行考虑。而连续的一段F又可以分成两类:靠边的和被夹在中间的。靠边的F段较为简单,假定有\(c\)个F,不难发现只要让EB交错出现就可以达到最少次数,而让所有的F都变成最近的非F就可以达到最多次数\(c......