CH Position(数列-打表找规律+贪心)

数列

总时限 10s 内存限制 256MB
出题人 SliverRiver 提交情况 2/7

【题目描述】

栋栋非常喜欢数列.

数列中有n个数且两两不同,并且该数列中所有的数都属于[0,n],那这个数列即为极好数列。

对于每两个极好数列A,B都有契合度,契合度的计算公式如下.

契合度 = (A0 Xor B0) + (A1 Xor B1) + ... + (An Xor Bn)

栋栋想知道,对于一个正整数n和数列A,数列B的最大的契合度为多少.

 

【输入】

输入文件为sequence.in

输入共2行,一个正整数n,第二行对数列A进行描述.

 

【输出】

输出文件为sequence.out

输出共2行.

第一行输出最大美好度.

第二行输出最大美好度所对应的唯一B数列.

 

【样例输入输出】

sequence.in

sequence.out

1

0 1

2

1 0

 

【样例解释】

对于n = 1,有两种情况(0,1)和(1,0)

对于(0,1):0 Xor 0 = 0,1 Xor 1 = 0.所以第一种的美好度为0.

对于(1,0):1 Xor 0 = 1,0 Xor 1 = 1.所以第二种的美好度为2.

 

【数据范围】

对于40%的数据,N≤12.

对于100%的数据,N≤100,000.

 

【时间空间限制】

    1s,256M

 

这题是打表找规律??

吸取经验教训,先打一个。。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (100)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int n,a[MAXN],ans[MAXN],st[MAXN],sum=0;
bool b[MAXN]={0};
void dfs(int l,int tot)
{
	if (l>n)
	{
		if (tot>sum) memcpy(ans,st,sizeof(st)),sum=tot;
		return ;
	}
	Rep(i,n+1) if (!b[i]) b[i]=1,st[l]=i,dfs(l+1,tot+a[l]^i),b[i]=0;
	
	
}
int main()
{
	freopen("CH-Position-sequence_dabiao.out","w",stdout);
	for(n=1;n<=10;n++)
	{
		memset(ans,0,sizeof(ans));sum=0;
		Rep(i,n+1) a[i]=i;
		dfs(0,0);
		Rep(i,n+1) cout<<ans[i]<<' ';cout<<endl<<sum<<endl;
	}
	return 0;
}

得到了:

1 0 
2
1 0 2 
6
3 2 1 0 
12
3 2 1 0 4 
20
1 0 3 4 5 2 
30
3 2 5 6 1 4 0 
42
7 6 5 4 3 2 1 0 
56
7 6 5 4 3 2 1 0 8 
72
1 4 5 7 0 3 6 8 9 2 
90
1 4 5 7 0 2 3 8 9 10 6 
110

于是还是没发现啊。。(太菜)

看了一下正解发现是这么贪心的。。

从大到小-每个数贪心使他^值 最大、、

也就是 111000 要配    000111 这样子的节奏。。

这样真的大丈夫??应该是优先贪最前面那位啊、、、//还是太弱

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (100000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int n,a[MAXN],b[MAXN];
bool used[MAXN]={0};
int main()
{
//	freopen("CH-Position-sequence.in","r",stdin);
	cin>>n;
	Rep(i,n+1) scanf("%d",&a[i]);
//	printf("%lld\n",(ll)n*(n+1));
	RepD(i,n)
		if (!used[i])
		{
			int p=0,m=1;
			for(m=1;m<=i;m<<=1);//cout<<m<<endl;
			if (i==0) p=0;else p=(m-1)^i;
			//for(int m=i;m;) p=(p<<1)+!(m&1),m>>=1;
			used[i]=used[p]=1;
			b[i]=p,b[p]=i;
		}	
	
	ll ans=0;
	Rep(i,n+1) ans+=i^b[i];
	cout<<ans<<endl;
	
	Rep(i,n) printf("%d ",b[a[i]]);printf("%d\n",b[a[n]]);
	
	
	return 0;
}









/* Application Result Buffer organisation for a) - 5 Channels - CH9, CH1, CH2, CH3 and CH4 - 3 streaming samples for each channel - No synchronous conversion kernels Result Buffer: Buffer Start Buffer End +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ |CH9|CH9|CH9|CH1|CH1|CH1|CH2|CH2|CH2|CH3|CH3|CH3|CH4|CH4|CH4| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ Data Buffer (DataBufferPtr): Buffer Start Buffer End +---+---+---+---+---+ |CH9|CH1|CH2|CH3|CH4| +---+---+---+---+---+ b) - 3 Channels - CH9, CH1, and CH2 - 2 streaming samples for each channel - Kernel K0 synchronization master, kernel K1 and K2 synchronization slaves - Channels CH9 and CH2 enabled for synchronous conversion Result Buffer: Buffer Start +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ |K0CH9|K0CH9|K0CH1|K0CH1|K0CH2|K0CH2| => |K1CH9|K1CH9|K1CH2|K1CH2| => +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ Buffer End +-----+-----+-----+-----+ => |K2CH9|K2CH9|K2CH1|K2CH1| +-----+-----+-----+-----+ Data Buffer (DataBufferPtr): Buffer Start Buffer End +-----+-----+-----+-----+-----+-----+-----+ |K0CH9|K0CH1|K0CH2|K1CH9|K1CH2|K2CH9|K2CH1| +-----+-----+-----+-----+-----+-----+-----+ c) - 3 Channels - CH9, CH1, and CH2 - 2 streaming samples for each channel - Kernel K1 synchronization master, kernel K0 and K3 synchronization slaves - Channels CH1 and CH2 enabled for synchronous conversion Result Buffer: Buffer Start +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ |K1CH9|K1CH9|K1CH1|K1CH1|K1CH2|K1CH2| => |K0CH1|K0CH1|K0CH2|K0CH2| => +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ Buffer End +-----+-----+-----+-----+ => |K3CH1|K3CH1|K3CH2|K3CH2| +-----+-----+-----+-----+ Data Buffer (DataBufferPtr): Buffer Start Buffer End +-----+-----+-----+-----+-----+-----+-----+ |K1CH9|K1CH1|K1CH2|K0CH1|K0CH2|K2CH1|K2CH2| +-----+-----+-----+-----+-----+-----+-----+ */
最新发布
03-26
<think>好的,我现在需要帮用户理解关于AURIX TC3xx系列芯片中EVADC模块的Application Result Buffer组织方式。用户给出了三个场景a、b、c,每个场景有不同的通道配置、采样数和同步内核设置,对应的Result Buffer和Data Buffer的结构也不同。我的任务是用中文详细解释这些结构,确保用户明白它们是如何组织的。 首先,我需要确认用户的问题是什么。看起来用户可能是在配置EVADC模块时遇到了问题,或者想要验证他们对于Result Buffer和Data Buffer的理解是否正确。用户可能是在进行嵌入式开发,特别是使用英飞凌的TC3xx系列芯片,需要正确配置ADC的结果缓冲区,以便有效读取转换结果。用户可能不太清楚同步转换、多内核协作以及如何将这些配置映射到实际的缓冲区布局。 接下来,我需要分析用户提供的三个场景,分别理解每个场景的配置,并解释对应的Result Buffer和Data Buffer的结构。我需要确保自己正确理解每个参数的含义,比如通道选择、流式采样数、同步主从内核的关系以及同步通道的配置。 对于场景a,用户描述的是5个通道(CH9、CH1、CH2、CH3、CH4),每个通道有3个流式样本,且没有同步转换内核。这意味着所有通道都是独立转换,没有内核之间的同步。Result Buffer中每个通道的3个样本连续存放,而Data Buffer则每个通道只有一个条目,可能是指针指向每个通道的结果起始位置? 不过用户提供的Data Buffer图示显示每个通道在Data Buffer中有一个条目,这可能是指每个通道的结果指针数组,每个指针指向Result Buffer中对应通道的起始位置。需要确认这一点是否正确,或者是否有其他解释。 接下来是场景b,3个通道(CH9、CH1、CH2),每个通道2个样本,同步主内核K0,从内核K1和K2,且CH9和CH2启用了同步转换。同步转换意味着主内核触发转换时,从内核也会同时转换指定的通道。Result Buffer的结构显示主内核K0的结果先存放,然后是K1和K2的结果,每个同步通道在每个内核中的样本连续存放。而Data Buffer则按内核和通道顺序排列,每个同步通道在不同内核中的结果依次存放。 场景c的情况类似,但同步主内核是K1,从内核是K0和K3,同步通道是CH1和CH2。Result Buffer中主内核K1的结果在前,然后是K0和K3的结果,而Data Buffer同样按内核顺序排列,但需要确认是否有笔误,比如最后一个内核是否是K3而不是K2,因为用户提供的Data Buffer中有K2CH1和K2CH2,这可能与实际的内核编号不符,可能是个错误。 在分析这些场景时,我需要确保理解每个配置参数如何影响Result Buffer和Data Buffer的布局。特别是同步转换时,主从内核的结果如何排列,以及同步通道的启用如何影响不同内核的数据存放位置。 可能的疑问点包括: 1. 为何在场景a的Data Buffer中每个通道只有一个条目,而Result Buffer中有多个样本?这可能是指Data Buffer是结果指针数组,每个指针指向对应通道在Result Buffer中的起始位置,而每个通道的多个样本连续存放。需要明确Data Buffer的作用。 2. 同步转换时,主从内核的结果如何排列?是否主内核的结果先存放,然后从内核依次存放? 3. 在场景c的Data Buffer中,最后一个条目是K2CH1和K2CH2,但用户描述中从内核是K0和K3,这可能是一个笔误,正确应为K3CH1和K3CH2? 需要核对用户提供的示例是否存在不一致之处,并在解释时指出可能的错误,避免用户混淆。 此外,可能需要解释EVADC模块中Result Buffer的组织方式,包括流式模式(streaming mode)下多个样本的存储方式,同步转换时多个内核的数据如何交织存放,以及Data Buffer的作用,可能是指应用程序读取结果时的数据结构,比如每个通道或每个内核-通道组合的指针。 在回答时,应该分步骤解释每个场景,先说明配置参数,再描述Result Buffer和Data Buffer的结构,最后总结关键点,如同步转换的影响、流式样本的存储顺序等。同时,需要指出用户提供的示例中可能存在的错误,如场景c的Data Buffer中的内核编号问题,以帮助用户避免配置错误。 最后,确保回答结构清晰,使用适当的Markdown格式,如代码块表示缓冲区布局,列表和表格整理信息,关键部分用强调,帮助用户逐步理解每个场景的配置和缓冲区组织方式。</think>--- ### **Application Result Buffer 组织结构解析** 以下是针对您提供的三种场景(a、b、c)的详细分析,涵盖**EVADC结果缓冲区(Result Buffer)**和**应用程序数据缓冲区(Data Buffer)**的映射逻辑。 --- #### **场景 a:无同步转换内核** ##### **配置参数** - **通道**:CH9, CH1, CH2, CH3, CH4(共5个通道) - **流式样本**:每通道3个样本 - **同步内核**:无 ##### **Result Buffer 结构** ```plaintext Buffer Start Buffer End +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ |CH9|CH9|CH9|CH1|CH1|CH1|CH2|CH2|CH2|CH3|CH3|CH3|CH4|CH4|CH4| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ ``` - **顺序规则**: - 按通道顺序排列(CH9 → CH1 → CH2 → CH3 → CH4) - 每个通道的**3个流式样本连续存储** ##### **Data Buffer 结构** ```plaintext Buffer Start Buffer End +---+---+---+---+---+ |CH9|CH1|CH2|CH3|CH4| +---+---+---+---+---+ ``` - **设计逻辑**: - Data Buffer 中每个元素对应一个通道的**首个样本地址** - 例如:`DataBufferPtr[0]` 指向 CH9 的第一个结果 `CH9_S0` --- #### **场景 b:同步主从内核(K0主,K1/K2从)** ##### **配置参数** - **通道**:CH9, CH1, CH2(共3个通道) - **流式样本**:每通道2个样本 - **同步内核**: - **主内核**:K0 - **从内核**:K1, K2 - **同步通道**:CH9, CH2 ##### **Result Buffer 结构** ```plaintext Buffer Start +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ |K0CH9|K0CH9|K0CH1|K0CH1|K0CH2|K0CH2| => |K1CH9|K1CH9|K1CH2|K1CH2| => +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ Buffer End +-----+-----+-----+-----+ => |K2CH9|K2CH9|K2CH1|K2CH1| +-----+-----+-----+-----+ ``` - **顺序规则**: 1. **主内核 K0** 的数据优先存储 2. **从内核 K1/K2** 数据按触发顺序追加 3. 同步通道(CH9, CH2)在**所有内核中必须对齐存储** ##### **Data Buffer 结构** ```plaintext Buffer Start Buffer End +-----+-----+-----+-----+-----+-----+-----+ |K0CH9|K0CH1|K0CH2|K1CH9|K1CH2|K2CH9|K2CH1| +-----+-----+-----+-----+-----+-----+-----+ ``` - **设计逻辑**: - 按内核优先级排序(K0 → K1 → K2) - 每个内核内按通道顺序排列(CH9 → CH1 → CH2) --- #### **场景 c:同步主从内核(K1主,K0/K3从)** ##### **配置参数** - **通道**:CH9, CH1, CH2(共3个通道) - **流式样本**:每通道2个样本 - **同步内核**: - **主内核**:K1 - **从内核**:K0, K3 - **同步通道**:CH1, CH2 ##### **Result Buffer 结构** ```plaintext Buffer Start +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ |K1CH9|K1CH9|K1CH1|K1CH1|K1CH2|K1CH2| => |K0CH1|K0CH1|K0CH2|K0CH2| => +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+ Buffer End +-----+-----+-----+-----+ => |K3CH1|K3CH1|K3CH2|K3CH2| +-----+-----+-----+-----+ ``` - **顺序规则**: 1. **主内核 K1** 的数据优先存储 2. **从内核 K0/K3** 数据按触发顺序追加 3. 同步通道(CH1, CH2)在**所有内核中必须对齐存储** 4. **非同步通道 CH9** 仅出现在主内核 K1 中 ##### **Data Buffer 结构** ```plaintext Buffer Start Buffer End +-----+-----+-----+-----+-----+-----+-----+ |K1CH9|K1CH1|K1CH2|K0CH1|K0CH2|K3CH1|K3CH2| +-----+-----+-----+-----+-----+-----+-----+ ``` - **注意**:原描述中的 `K2CH1/K2CH2` 应为笔误,实际应为 `K3CH1/K3CH2` --- ### **关键总结** 1. **同步通道规则**: - 同步通道必须**在所有内核中保持一致存储顺序** - 非同步通道仅出现在主内核中 2. **流式样本存储**: - 每个样本按转换顺序连续存储(例如 `CH9_S0 → CH9_S1 → CH9_S2`) 3. **内核优先级**: - 主内核数据优先存储,从内核按触发顺序追加 4. **Data Buffer 设计**: - 通常用于应用程序直接访问,需根据内核和通道顺序预定义指针 --- ### **调试建议** 1. **寄存器配置**: - 检查 `GxARBCFG.ASEN`(流式模式使能) - 设置 `ARBPR.LCK` 前确保所有内核配置完成 2. **同步触发验证**: - 使用示波器监控主从内核的启动信号(例如 `EVADCx_TRIGy`) 3. **内存对齐**: - 确保 Result Buffer 地址对齐到 `4*N`(N为通道数) 若需进一步验证代码实现,请提供具体的芯片型号(如 TC387)和 EVADC 初始化代码片段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值