第一题niven
如果一个数的各位数字之和能整除它对应的十进制数,则这个数叫 Niven 数。例如:十进制 111 是 Niven 数,因为各位数字之和是 3,能够整除 111。同样地,对其他数制 b,在该进制下,如果一个数的各位数字之和能够整除该数字对应的十进制,也是一个 Niven 数。
给出数制 b(2≤b≤lO)和一个 b 数制的数字,判断这个数是否是 Niven 数。

输入格式
每个测试点有包含多组测数据(不超过 100 组)!
每组数据块占一行,有两个整数,分别是进制 b 和一个 b 数制的数字(数字串的最大长度=50,但任何进制转成十进制后都不超过 int 范围)。
最后一行只有一个 0 ,表示输入结束。

输出格式
对每组测试数据,输出一行,如果该数是一个 Niven 数,就输出“yes”,否则输出“no”。

经分析为简单的进制转换,忽略掉........

第二题
给出一个全部由小写字母构成的字符串,要求从该串中找出满足下面条件的最长子串:
条件1:子串是连续的;
条件2:子串的长度是偶数;
条件3:沿子串的中心切开,对左右两部分的串按顺序进行比较,要求不同的字符对数 N 不超过题目给出的一个限定值 D 。
比如:abcaec 的 N 值为 1。因为平分的两部分 abc 和 aec 比较,只有 1 对字符不同:即 b 和 e,而其余字符都相同。

输入格式
只有一行,先是一个整数 D(0≤D≤1000),然后一个空格,接着是一个由小写字母构成的字符串(长度不超过2000)。
样例数据 2
输入 0 kjjjgieie
输出 4 ieie
我原本想通过略优化的枚举暴力破解,但不知哪里除了问题,因此采用同刘同学的双指针做法,核心代码如下
    h=strlen(s);
    hh=h/2;//分子集一半的最大长度
    for (i=hh;i>0;i--)
    {
        for (j=i;j<h;j++)
            if (s[j]!=s[j-i]) f[j]=1;
              else f[j]=0;
        a[i]=f[i];
        m=2*i;
        for (j=i+1;j<m;j++)
            a[j]=a[j-1]+f[j];
        for (j=m;j<h;j++)
            a[j]=a[j-1]+f[j]-f[j-i];
        for (j=m-1;j<h;j++)
            if (a[j]<=d)
            {
                b=true;
                u=0;
                for (k=j-m+1;k<=j;k++)
                    t[u++]=s[k];
                t[m]=0;
                printf("%d %s\n",m,t);
                break;
            }、、采用双指针
            if (b) break;
    }
股票经纪人以对传闻的准确判断而闻名。你已签定一个合同,就是研究一种方法,在股票经纪人中间传播假情报,以便雇主在股票市场中赢得先机。为了得到最大效益,你必须尽可能快地散布传闻。
不幸的是,股票经纪人只信任来自他们“可靠来源”的消息。这意味着,在散播传闻时,你必须考虑他们所接触的人际关系。某个股票经纪人需要花一些时间把传闻传递给他的每一位同事。
你的任务是写一个程序,确定从哪个证券经纪人开始散播传闻最快,以及传闻传递到整个证券界时所需要最少时间。这个时间是指最后一个人收到传闻的时间。
每个股票经纪人从1开始编号,一直到股票经纪人的总数。
输入格式          开始的一行,是股票经纪人的数目 N(1≤N≤100)。
接下来每个股票经纪人一行:第一个整数是这个股票经纪人的联系人个数 M(0≤M≤100),接着是 M 对整数,每对整数对应一位联系人。每对数的第一个是联系人编号,然后是此人传递消息的时间 T(1≤T≤10)。
注意:假如某一对股票经纪人之间可以互相传递消息,那么从 A 传给 B 的时间并不一定等于从 B 传给 A 的时间。
输出格式          输出一行,包含两个整数,第一个是消息传递最快的人的编号(如果传递速度最快的有多个相同,则输出编号最小的);第二个整数是最后一个人得知消息所需要的时间(分钟)。
程序很可能会接收到一个不完整的人际关系网络,也就是某些人不能收到消息。如果程序检测到一个不完整的网络,只需输出“disjoint”。

原本用spfa算法,但因为本题为多元最短路径且点较多,采用floyed算法更好。

第四题 二分答案

在给定的 N 个数中选出 R×C 个数,然后填入 R×C 的矩阵中,每一行的 D(i) 定义为本行最大值与最小值的差,然后要令所有行中 D(i) 的最大值 F 尽量小,其中1≤i≤R。请你求出满足条件的 F 。

输入格式
第一行是三个整数:N,R,C,其中, 1≤R,C≤104 ,R×C≤N≤5×105 。
第二行是 N 个整数 Pi ,0<Pi≤109

原本想采用简单的枚举交换的策略,但是显然有问题且过于复杂,最后采用二分答案,核心代码如下:
int left,right,mid;
    
   right=shu[n]+1;  
   left=-1;
   
   while(right-left>1)
   {
      mid=(right+left)/2;
      s=0;
      for(i=1;i<=n-b+1;)
        {
          if(shu[i+b-1]-shu[i]<=mid)
           {
             i=i+b;
             s++;
           }
          else i++;
          
        }                
      if(s>=a) right=mid;
       else left=mid;                  
   }


综上,本次开始我的问题主要存在于只用spfa算法,不考虑floyed与dijiska的好处,同时对于二分答案与指针的用法有所不足