首页 > 其他分享 >CSP-J2020试题

CSP-J2020试题

时间:2023-05-18 23:47:45浏览次数:52  
标签:试题 int ll tree cin long flag CSP J2020

1.优秀的拆分

原题:https://www.luogu.com.cn/problem/P7071

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e4+255;
ll n,x=0,power[N];
int main(){
	cin>>n;
	if(n%2==1)cout<<"-1";
	else{
		while(n){
			power[++x]=n%2;
			n/=2;
		}
		for(int i=x;i>=1;i--){
			if(power[i]==1)cout<<(ll)(pow(2,i-1))<<' ';
		}
	}
	return 0;
}

  

解题思路:

题目中说n必须由2的正整数次幂组成,1是2的0次幂,所以n不可以是奇数,然后分解成二进制,输出就是答案

 

2.直播获奖

原题:https://www.luogu.com.cn/problem/P7072

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 6e2+255;
int sum[N],n,w,a;
int main(){
	cin>>n>>w;
	for(int i=1;i<=n;i++){
		cin>>a;
		int fx=max(1.0,floor(i*w/100.0));
		sum[a]++;
		for(int j=600;j>=0;j--){
			fx-=sum[j];
			if(fx<=0){
				cout<<j<<' ';
				break;
			}
		}
	}
	return 0;
}

  

解题思路:

大模拟,计算获奖人数,用一个桶统计分数,从600到0,减去每个分数的人数,直到0或0以下为止

 

3.表达式

原题:https://www.luogu.com.cn/problem/P7073

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6+255;
struct nod{
	bool v;int l,r;char op;
}tree[4*N];
int n,q,k,flag[N],cnt;
string s;
void readp(){
	getline(cin,s);
	s+=" ";
	cin>>n;cnt=n;
	for(int i=1;i<=n;i++){
		cin>>tree[i].v;
		tree[i].l=tree[i].r=0;
		tree[i].op='#';
	}
}
void build(){
	stack<int>sta;int t=-1,num1,num2;
	for(int i=0;i<s.length();i++){
		if(s[i]=='x')t=0;
		else if(s[i]>='0'&&s[i]<='9')t=t*10+(s[i]-'0');
		else if(s[i]==' '){
			if(t!=-1){
				sta.push(t);
				t=-1;
			}
		}else if(s[i]=='!'){
			num1=sta.top();sta.pop();
			tree[++cnt].l=num1;
			tree[cnt].op='!';
			tree[cnt].r=0;
			tree[cnt].v=!tree[num1].v;
			sta.push(cnt);
		}else if(s[i]=='&'){
			num2=sta.top();sta.pop();
			num1=sta.top();sta.pop();
			tree[++cnt].l=num1;
			tree[cnt].r=num2;
			tree[cnt].op='&';
			tree[cnt].v=tree[num1].v&tree[num2].v;
			sta.push(cnt);
		}else if(s[i]=='|'){
			num2=sta.top();sta.pop();
			num1=sta.top();sta.pop();
			tree[++cnt].l=num1;
			tree[cnt].r=num2;
			tree[cnt].op='|';
			tree[cnt].v=tree[num1].v|tree[num2].v;
			sta.push(cnt);
		}
	}
}
void dfs(int root){
	flag[root]=1;
	if(tree[root].op=='#')return;
	if(tree[root].op=='!')dfs(tree[root].l);
	if(tree[root].op=='&'){
		if(tree[root].v==0){
			if(tree[tree[root].l].v==1)dfs(tree[root].r);
			else if(tree[tree[root].r].v==1)dfs(tree[root].l);
		}else{
			dfs(tree[root].l);
			dfs(tree[root].r);
		}
	}
	if(tree[root].op=='|'){
		if(tree[root].v==1){
			if(tree[tree[root].l].v==0)dfs(tree[root].r);
			else if(tree[tree[root].r].v==0)dfs(tree[root].l);
		}else{
			dfs(tree[root].l);
			dfs(tree[root].r);
		}
	}
}
int main(){
	readp();
	build();
	dfs(cnt);
	cin>>q;
	while(q--){
		cin>>k;
		if(flag[k])cout<<!tree[cnt].v<<'\n';
		else cout<<tree[cnt].v<<'\n';
	}
	return 0;
}

  

解题思路:

建好表达式树,进行深搜,如果是“!” ,遍历左孩子,如果是“&”或“|”,遍历左孩子和右孩子,遍历到的节点都打上标记,最终输出结果

 

4.方格取数

原题:https://www.luogu.com.cn/problem/P7074

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e3+5;
ll n,m,a[N][N],dp[N][N][3];
ll dfs(ll x,ll y,ll flag){
	if(dp[x][y][flag]!=-1)return dp[x][y][flag];
	if(x==n&&y==m)return dp[x][y][flag]=a[n][m];
	ll ans=-1e10;
	if(y<m)ans=max(ans,dfs(x,y+1,2));
	if(x>1&&flag!=0)ans=max(ans,dfs(x-1,y,1));
	if(x<n&&flag!=1)ans=max(ans,dfs(x+1,y,0));
	return dp[x][y][flag]=ans+a[x][y];
}
int main(){
	memset(dp,-1,sizeof(dp));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	cout<<dfs(1,1,2)<<'\n';
	return 0;
}

  

解题思路:运用记忆化剪枝,可以大大降低dfs的复杂度,建立一个flag,用来记录方向,遍历三个方向,取最大值就是答案

标签:试题,int,ll,tree,cin,long,flag,CSP,J2020
From: https://www.cnblogs.com/zhanghx-blogs/p/17413625.html

相关文章

  • java面试题--Redis
    一、说一下redis的持久化机制原理?RDB文件:redisdatabase。存储的是某个时间点的数据库内容的快照,是结果。redis默认的持久化策略。落盘策略:使用SAVE或者BGSAVE命令。(1)SAVE:有主线程执行,会阻塞客户端。(2)BGSAVE:会fork出一个子进程,不会出现阻塞问题。子进程使用写时拷贝的策......
  • CSP-J2022试题题解
    1.乘方原题:https://www.luogu.com.cn/problem/P8813代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintXN=1e9;lla,b,ans=1;intmain(){ cin>>a>>b; for(inti=1;i<=b;i++){ ans*=a; if(ans>XN){ cout......
  • JVM(四)虚拟机栈(三)虚拟机栈面试题
    JVM(四)虚拟机栈(三)虚拟机栈面试题1举例栈溢出的情况?当方法调用不停将栈帧压入虚拟机栈导致栈内空间不足而出现StackOverFlowError即是出现了栈溢出可以通过-Xss设置栈的大小,栈的大小可以是固定的也可以是动态变化的,如果固定且超出设定值则就会出现栈溢出;如果是动态变化的,栈空......
  • JAVA面试题及解析
    Java中有哪些集合Java中的集合可以分为4类,使用4个接口代表,分别是ListSetQueueMap。其中ListSetQueue都继承自Collection。List:是有序可重复集合,元素可为空,常用的有ArrayListLinkedListSet:无序不可重复集合元素可为空,常用的有HashSetTreeSetQueue:先进先出的队列,常......
  • 【Cocos2d游戏开发之九】CCSpriteBatchNode与"pvr.ccz","plist"精灵优化及注意事项
     首先对于使用过精灵的童鞋很熟悉CCSpriteBatchNode,至少大家都会知道它能优化精灵,但是至于优化原理这里简单说下:      一般使用精灵CCSprite的时候,都是直接使用[CCLayer*addChild:CCSprite*];,假设我们创建一百个精灵,那么当前的CCLayer会为100个精灵单独绘制;  ......
  • Ep_操作系统面试题-什么是协程
     协程是一种比线程更加轻量级的存在,一个线程可以拥有多个协程。是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行),**不会像线程切换那样消耗资源。**面试宝典 很多人不......
  • JavaSE面试题【长期更新】
    面试题1包装类型的缓存机制了解过么包装类型的缓存机制了解过么/*ByteShortIntegerLong底层维护一个[-128,127]的缓存数组来提升性能Character底层维护一个[0,127]的数组Boolean包装类型直接返回true或者false*/2自动装箱和拆箱底层原理答案/*装箱将......
  • #yyds干货盘点# LeetCode面试题:乘积最大子数组
    1.简述:给你一个整数数组nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位整数。子数组是数组的连续子序列。 示例1:输入:nums=[2,3,-2,4]输出:6解释: 子数组[2,3]有最大乘积6。示例......
  • 【题解】Luogu[P8818] CSP-S 2022 策略游戏
    一道简单区间rmq分类讨论题,考场上最后5分钟想出来,没写出来,退役了……给定两个序列\(A_{1},\dots,A_{n}\);\(B_1,\dots,B_n\)规定\(C_{i,j}=A_i\timesB_i\)。题目说小L和小Q必定选择最优策略,而小L先选,小Q后选,小L要使得\(C_{i,j}\)尽可能大,小Q要使得\(C_{i,j}\)......
  • 【游记】CSP2021
    CSp2021坐标:BJ初赛Day-1什么也没复习!!!学校集训的时候在打osu没听课(逃所以肯定过不了初赛!!!Day1S这都是什么jb题啊,base64又是什么啊???四毛子???只能说ccf你萌死了。。。复赛Day-n好吧只能说苟过去了初赛。国庆集训两天,继续打osu一直在打暴力,因为教练知道我技术不行,说保有......