洛谷训练
Posted 未定_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷训练相关的知识,希望对你有一定的参考价值。
P1017 (NOIP2000 提高组)进制转换
题意:设计一个程序,读入一个十进制数和一个负进制数的基数, 并将此十进制数转换为此负进制下的数。
分析:-15转化为-2进制如下:
对于余数k,负进制-r,余数的范围为(-r+1,0),因为余数不能小于0,进行k=(k-(-r))%r的操作,余数k的范围变为(0,r-1)。符合要求。每次取余后原数应变为(n-k)/r,因为被除数=除数*商+余数,商=(被除数-余数)/除数。
#include<iostream>
using namespace std;
int a[100000];
int main( )
{
int n,r,p=0,k,q;
cin>>n>>r;
q=n;
while(n!=0)
{
k=n%r;
k=(k-r)%r;
a[p++]=k;
n=(n-k)/r;
}
cout<<q<<"=";
for(int i=p-1;i>=0;i--)
{
if(a[i]>9)
cout<<char(a[i]-10+'A');
else cout<<a[i];
}
cout<<"(base"<<r<<")"<<endl;
}
P1019 (NOIP2000 提高组)单词接龙
题意:单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。
分析:考虑到用DFS,分析见代码
#include<iostream>
#include<cstring>
using namespace std;
string s[25];
int n,gs[25],len=0;//len为最长的长度
char ch;
void dfs(string str,int l)//str为单次接龙的前一个单次,l为当前长度
{
len=max(len,l);
for(int i=0; i<n; i++)
{
if(gs[i]==0)
continue;
int cd=0,x=str.length(),y=s[i].length();
for(int j=1; j<min(x,y); j++)//这里的j<min(x,y),不能等于,因为要避免at和atide不能相连的情况。
{
if(str.substr(x-j,j)==s[i].substr(0,j))//前一个单词从后面几位截取,后一个单次从前面截取,寻找可截取的最小长度
{
cd=j;//cd表示重叠
break;
}
}
if(cd)
{
gs[i]--;
dfs(s[i],s[i].length()+l-cd);
gs[i]++;//回溯
}
}
}
int main( )
{
cin>>n;
for(int i=0; i<n; i++)
{
cin>>s[i];
gs[i]=2;
}
cin>>ch;
for(int i=0; i<n; i++)
{
if(s[i][0]==ch)
{
gs[i]--;
dfs(s[i],s[i].length());
}
}
cout<<len<<endl;
}
以上是关于洛谷训练的主要内容,如果未能解决你的问题,请参考以下文章