洛谷训练(21.10.17)

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;
}

Guess you like

Origin blog.csdn.net/weixin_51443397/article/details/120807397