2021.08.24 自测1(300)

300=100+100+0+100

[P1019 NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

搜索。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=25;
string s[N];
int len,vis[N],n;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
int repeat(string a,string b){
	for(int l=1;l<min(a.length(),b.length());l++){
		int flag=1;
		for(int i=0;i<l;i++)if(b[i]!=a[a.length()-l+i])flag=0;
		if(flag)return l; 
	}
	return 0;
}
void dfs(string now,int l){
	len=max(l,len);
	for(int i=1;i<=n;i++){
		if(vis[i]>=2)continue;
		int li=repeat(now,s[i]);
		if(li){
			++vis[i];
			dfs(s[i],l+s[i].length()-li);
			--vis[i];
		}
	}
}

int main(){
	n=read();
	for(int i=1;i<=n+1;i++)cin>>s[i];
	dfs(' '+s[n+1],1);
	cout<<len;
	return 0;
}

[P1017 NOIP2000 提高组] 进制转换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

负进制。(数学)

重点:

1.负进制:-7%-2=-1

为了让负进制的出来的数字为正:

\[(商+1)*除数+(余数-除数)\\ =商*除数+余数\\ =被除数 \]

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=20;
int n,flag,r,ri,log[20],ans[20];
char jz[25]={'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J'};

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void change(int n,int r){
	if(!n)return ;
	int xi=n%r;
	if(xi<0)xi-=r,n+=r;
	change(n/r,r);
	cout<<jz[xi]; 
}

int main(){
	n=read();r=read();
	cout<<n<<"=";
	change(n,r);
	printf("(base%d)",r);
	return 0;
}

原正进制的代码:

printf用法之打印2进制,八进制,十进制,十六进制 - Howe_Young - 博客园 (cnblogs.com)

C语言printf()函数:格式化输出函数_C语言中文网 (biancheng.net)

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=20;
int n,flag,r,ri,log[20],ans[20];
char jz[25]={'0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J'};

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	n=read();ri=read();
	r=(ri>0?ri:-ri);
	log[0]=1;
	for(int i=1;i<=16&&log[i-1]<=37336;i++)log[i]=log[i-1]*r,flag=i;
	for(int i=0;i<=16;i++)cout<<log[i]<<" ";cout<<endl<<endl;
	cout<<flag<<endl<<endl;
	for(int i=0;i<=19;i++)cout<<jz[i]<<" ";cout<<endl<<endl;
	int x=(n>0?n:-n);
	while(x){
		while(log[flag]>x)--flag;
		int xi=x/log[flag];
		cout<<"front "<<x<<" after ";
		x-=xi*log[flag];ans[flag]=xi;
		cout<<x<<" xi "<<xi<<" position "<<flag<<" number "<<log[flag]<<endl;
	}
	cout<<n<<"=";
	flag=0;
	for(int i=16;i>=0;i--){
		if(!flag&&!ans[i])continue;
		if(!flag&&ans[i])flag=1;
		if(flag)cout<<jz[ans[i]];
	}
	printf("(base%d)",ri);
	return 0;
}

[P1013 NOIP1998 提高组] 进制位 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

进制。(数学+观察)

noip提高1998 进制位:STL对字符串的应用 - deemoender 的博客 - 洛谷博客 (luogu.com.cn)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;

int n;
char start[10],check[10];
string x,y;
map<char,int>num;
map<char,int>vis;

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}

int main(){
	n=read();
	cin>>x;
	for(int i=1;i<n;i++)cin>>x,start[i]=x[0];
	for(int i=1;i<n;i++){
		for(int j=1;j<=n;j++){
			cin>>x;
			if(j!=1&&j!=2&&x==y)return cout<<"ERROR!",0;
			y=x;
			if(x.length()==2)++num[start[i]],++vis[x[1]];
		}
	}
	for(int i=1;i<n;i++)
	if(num[start[i]]!=n-2-vis[start[i]])return cout<<"ERROR!",0;
	for(int i=1;i<n;i++)cout<<start[i]<<"="<<num[start[i]]<<" ";\
	cout<<endl<<n-1;
	return 0;
}

[P1005 NOIP2007 提高组] 矩阵取数游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

dp+高精/__int128

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
typedef __int128 lll;
const int N=85;
int n,m,a[N];
lll f[N][N],ans,log[N];

inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch<='9'&&ch>='0'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
void print(lll x){
	if(x>9)print(x/10);
	putchar(x%10+'0');
}
lll solve(int l,int r,int id){
	if(f[l][r]!=-1)return f[l][r];
	if(r-l>0)
		f[l][r]=max((lll)a[l]*log[id]+solve(l+1,r,id+1),(lll)a[r]*log[id]+solve(l,r-1,id+1));
	else f[l][r]=a[l]*log[id];
	return f[l][r];
}

int main(){
	n=read();m=read();
	log[0]=1;
	for(int i=1;i<=m;i++)log[i]=log[i-1]*2;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)a[j]=read();
		memset(f,-1,sizeof(f));
		ans+=solve(1,m,1);
	}
	print(ans);
	return 0;
}
 posted on 2021-08-24 11:07  eleveni  阅读(52)  评论(1)    收藏  举报