2010 辽宁省省赛 题解

题目来源:2010辽宁省省赛


比赛名:NBUT 2012 Weekly - 13th Oct for 11x


题目链接:http://ac.nbutoj.com/Problem.xhtml?page=3   1217~1225


比赛的时候过了8题,H题后来知道是什么了。。但是还是不知道怎么求。。。


A题:水题,字符串比较。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xx>c;
            if(c=="bowl"||c=="knife"||c=="fork"||c=="chopsticks")
            {
               if(flag==0)
               printf(" ");
               cout<


B题:给一棵树,问树上两个点,哪个的深度小。

           直接每次把两个点移动到父节点,记录下他们走过的点,某个点走到另一个点走过的点,说明这个点深度大。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xx




C题:给4个1位数字,用计算器的格式输出。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xx
} return 0;

D:给三个字符串列表,第一个代表要来A国的人,第二个代表B国的间谍,第三个代表A国派去B国的间谍【也就是A国的人】,问来的人中,B国的间谍有哪些  

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xxmp;
int main()
{
     int n1,n2,n3;
     while(scanf("%d%d%d",&n1,&n2,&n3)!=EOF)
     {
         string c[10000];
         mp.clear();
         for(int i=0;i>c1;
             mp[c1]=1;
         }
         for(int i=0;i>c[i];
             mp[c[i]]++;
         }
         for(int i=0;i>c1;
             mp[c1]--;
         }
         bool flag=0;
         for(int i=0;i
E题:给一个图,图上的每条边都被一个人管理着,每条边有个过路费,第一次经过a管理的路时,只用交过路费,第二次要多交e[a],第三次要多交f[a]。问0~n-1的最少花费的路径。

          正解应该是状态压缩搜索吧。因为管理者最多有9个,所以我们可以用一个3^9的数代表被管理的道路的状态。dp[i][j]代表到第i个点,状态为j,最少花费为多少,直接记忆化搜索一发应该就行了。。

          比赛的时候直接爆搜过了,当时没多想就觉得数据很小有可能爆过去。。


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xxroad[111];
int e[11]={0};
int f[11]={0};
int use[11]={0};
int vis[111]={0};
int n,m,q;
long long minn=INF;
void find(int pos,int sum)
{
     if(sum>=minn)
        return;
     if(pos==n-1)
     {
         minn=sum;
         return;
     }
     for(int i=0;i
F题:给一个字符串,和n个子串,每个子串有一个权值,用子串去填充原串,一个串可以用多次,问填充后最大权值是多少,若不能完全填充输出-1 首先肯定是要DP的,但是因为原串长10000,子串长30,并且有1000个,所以复杂度会有3亿不科学。于是想到用字典树。 将所有串加到字典树中,然后memset(dp,-1,sizeof(dp));,dp[0]=0,之后直接dp,对于每个不为-1的dp值,去查找这个点往后的30个子串是否存在于字典树中,若存在则更新下一个dp值。然后这样会T,有一个优化必须加,往后找子串的时候,假如找到某一个子串,在查找过程中遇到了-1而退出,说明后面的子串肯定都不满足条件,就可以直接退出本次DP。加了之后170ms过。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xx=0)
                {
                   if(dp[i+j+1]

G题:问a,b中的亲和数对数

           直接打表= =。。。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xx=a&&aa[i]<=b)
               cnt++;
       //     else if(aa[i]>b)
       //        break;
         }
         printf("%d\n",cnt);
     }
     return 0;
}

H题:解佩尔方程。。。

           当时就跪了。。想了很久都不会,结果熊教一眼就看出是佩尔方程Orz。。但是还是不会求。。。提供一份代码,以后研究去。。

code by eapink

#include
#include
#include
#include
#include
#include
using namespace std;
int count(string s)
{
    int count=0;
    for(int i=0;i=0;n2--)
        if(s2[n2])
            for(int n1=s1.length()-1,n=n2+s1.length();n1>=0;--n1,--n)
            {
                int temp=(s1[n1]-'0')*(s2[n2]-'0');
                cheng[n-1]=char(cheng[n-1]+(cheng[n]+temp-'0')/10);
                cheng[n]=char((cheng[n]+temp-'0')%10+'0');
            }
            if(count(cheng)==cheng.length())
                return "0";
            return cheng.substr(cheng.find_first_not_of('0'));
}
  
string sum(string s1,string s2)
{
    if(s1.length()=0;n1--,n2--)
    {
        s1[n1]=char(s1[n1]+(n2>=0?s2[n2]-'0':0));
        if(s1[n1]-'0'>=10)
        {
            s1[n1]=char((s1[n1]-'0')%10+'0');
            if(n1) s1[n1-1]++;
            else s1="1"+s1;
        }
    }
    return s1;
}
  
  
string change(int a)
{
    string s1="";
    char s2[10000];
    int i=0;
    while(a)
    {
        s2[i++]=(a%10)+'0';
        a/=10;
    }
    for(--i;i>=0;--i)
        s1+=s2[i];
    return s1;
}
  
int main()
{
    //freopen("b.txt","w",stdout);
    string h[3],k[3],aa;
    long long lp[3],lq[3],a[3];
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if((int)sqrt((double)n)*(int)sqrt((double)n)==n)
        {
            printf("no solution\n");
            continue;
        }
        int s;
        a[2]=s=sqrt((double)n);
        h[0]="0";h[1]="1";
        k[0]="1";k[1]="0";
        lp[1]=0;lq[1]=1;
        int p=2;
        while(1)
        {
            if(p==0)
            {
                lp[0]=-lp[2]+a[0]*lq[2];
                lq[0]=(n-lp[0]*lp[0])/lq[2];
                a[1]=floor((double)(lp[0]+s)/lq[0]);
                h[0]=sum(muling(change(a[0]),h[2]),h[1]);
                k[0]=sum(muling(change(a[0]),k[2]),k[1]);
                  
            }
            else if(p==1)
            {
                lp[1]=-lp[0]+a[1]*lq[0];
                lq[1]=(n-lp[1]*lp[1])/lq[0];
                a[2]=floor((double)(lp[1]+s)/lq[1]);
                h[1]=sum(muling(change(a[1]),h[0]),h[2]);
                k[1]=sum(muling(change(a[1]),k[0]),k[2]);
            }
            else
            {
                lp[2]=-lp[1]+a[2]*lq[1];
                lq[2]=(n-lp[2]*lp[2])/lq[1];
                a[0]=floor((double)(lp[2]+s)/lq[2]);
                h[2]=sum(muling(change(a[2]),h[1]),h[0]);
                k[2]=sum(muling(change(a[2]),k[1]),k[0]);
            }
            string s1=muling(h[p],h[p]);
            string s2=sum("1",muling(change(n),muling(k[p],k[p])));
            if(s1==s2) //h[p]*h[p]==1+n*k[p]*k[p]
            {
                cout<

I题:1~n n个数排成一行,每次把偶数位置上的数抽出来,再把奇数位置上的一个一个接在后面,形成一个新数列,问M次操作之后,前X个数分别是什么。

       因为M很大,肯定不能暴力。

       先假设这个数列无限大,那么M次操作之后,第一个数是2^m,第二个数是2*2^m,第三个数是3*2^m……………………

       那么假如这个数列的个数是奇数的话,因为2^m和n互质,把每个数%n就能得到答案了。

       那么如果这个数是偶数呢?很容易发现,如果数列是奇数的话,最后一个数永远都不会变,那么我们能把它看成一个n+1长度的数列,对n+1取模就行了。

      加个快速幂,然后如果模出0的话记得变成n。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define INF 0x7fffffff
#define clr(x)  memset(x,0,sizeof(x));
#define clrto(x,siz,y)  for(int xx=0;xx<=siz;xx++)  x[xx]=y;
#define clrset(x,siz)  for(int xx=0;xx<=siz;xx++)  x[xx]=xx;
#define clrvec(x,siz) for(int xx=0;x<=siz;xx++)  x[xx].clear();
#define fop   freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define myprogram By_135678942570
#define clrcpy(x,siz,y)  for(int xx=0;xx>=1;
        }
        int sum=0;
        for(int i=0;i



终于完整的做完一次比赛了。。。

虽然貌似略水。。


          Posted by 135678942570   blog.csdn.net/ttl_135678942570


你可能感兴趣的:(其他OJ,2010,string,n2,insert,c,ini)