PKU_ACM解题日记

 
2007 9 19 星期三      3
 
1664      放苹果         简单的递归
              算法如下:
                                   1):要么每个盘子都放一个,要么只放到n-1个盘子
              代码如下:
                                   int placeapple(int m,int n)
{
       if(m<0)return 0;//有些盘不放,已在placeapple(m,n-1)里面了,故返回零
       if(m==0)return 1;//每个盘都放一个,这是一种情况
       if(n==0)return 0;//剩余的只放到一个盘去,已在placeapple(m,n-1)里面了,故返回零
return placeapple(m-n,n)+placeapple(m,n-1);//要么每个盘都放一个,要么只放到n-1各盘
}
 
3077        Rounder         送分题
              题意:            从最低位开始向最高位四舍五入
              代码:           
                                  
 
3078        Q                   简单的模拟题
算法:              1):设置两个数组a[],b[],把每次操作中的a中指定的元素放到数组b指定的位置去
                     2):把数组a中剩余的元素依次放到数组b中的空位即可!
                     3):按序输出数组b的各元素
代码:           
 
 
 
2007 9 20 星期四      4
 
1458        Common Subsequeuece        动态规划求最长公共子序列
              算法:            典型的简单的动态规划
              代码:           
注意的地方:读入字符串时候while(scanf("%s%s",a,b)==2),这样子是AC,while(scanf("%s%s",a,b))这样子是TLE!
 
2007 9 21 星期五      6
 
2014        Flow Layout                        简单的模拟题(送分题)
              算法:           
              代码:           
              注意的地方:这类题目就是要小心!!!凡是模拟题都是!!!
2766        Laserbox                             模拟题,有点烦,主要还是不够细心!
              算法:           
              代码:           
 
2007 9 22 星期六      8
 
1125      Stockbroker Grapevine         典型的FLOYD
              算法:            floyd
              代码:           
 
2421        Constructing Roads               最少生成树(prim)(kruskal还没调出来)
              算法:            prim
              代码:            void prim(int a[][max],int n,int v)
{
       int lowcost[max],vset[max],cost=0;
       for(int i=1;i<=n;i++)
              vset[i]=0;
       for(i=1;i<=n;i++)
              if(i!=v)
                     lowcost[i]=a[v][i];
       for(i=1;i找出n-1个顶点
       {
              int min=INF,k=-1;
              for(int j=1;j<=n;j++)
                     if(vset[j]==0&&lowcost[j]
                     {
                            min=lowcost[j];
                            k=j;
                     }
              cost+=min;
              vset[k]=1;
              for(j=1;j<=n;j++)
                     if(vset[j]==0&&lowcost[j]>a[k][j])
                            lowcost[j]=a[k][j];
       }
       cout<
}
备注:     其实prim算法的代码跟Dijkstra算法求最短路径很相像,都用到一个标志数组和要寻找最短的边
 
 
 
 
 
2007 9 23 星期天      9
 
3388        Jananese Puzzle             简单的二分
              算法:            二分
              代码:           
 
 
2007 9 24 星期一      13
 
3385        Genealogy                    简单题
              算法:           
              代码:           
 
3386        Halloween Holidays       简单题
              算法:           
              代码:           
 
1088        滑雪                             动态规划
              算法:            DP的记忆化搜索
              代码:            int skee(int I,int j)
                    {
                          Int max=1,tmp;
                        If(len[i][j]!=-1)return len[i][j];
                        If(a[i][j]1)
                        {
                              Tmp=skee(i-1,j);
                            If(max
                        }
                        If(a[i][j]
                        {
                            Tmp=skee(i+1,j);
                            If(max
                        }
                        If(a[i][j]1)
                        {
                              Tmp=skee(i,j-1);
                            If(max
                        }
                        If(a[i][j]
                        {
                            Tmp=skee(i,j+1);
                            If(max
                        }
                        Len[i][j]=max;return max;              }
1159               Palindrome            给出一个句子,问插入几个字符可使之成为回文
              算法:            典型的DP
              代码:            if(s[i]==s[j])min[i][j]=min[i+1][j-1];
                    else min[i][j]=minimum(min[i+1][j],min[i][j-1])+1 
                    其中,i从n开始到1,j从i到n,最后min[1][n]就是所求!
 
2007 9 25 星期二      14
 
1978        Hanafuda Shuffle          简单题
              算法:           
              代码:           
 
2007 9 26 星期三      (16)
 
1080        Huma Gene Functions    变种最长公共子序列(DP)
              算法:     DP(LCS)
              代码: 动归方程
func[i][j]=max(func[i-1][j]+w[a[i]][0],func[i][j-1]+w[0][b[j]],func[i-1][j-1]+w[a[i]][b[j]])
 
2196        Specialized Four-Digit Number    简单题
算法:     用de记录num用十进制表示时的各位数之和,du记录用12进制表示时的各位数之和,he则记录十六进制时的各位之和,若de==du==he,则输出num
代码:    
 
2007 9 27 星期四      (20)
 
2039        To And Fro                   简单题
              算法:            按序保存在一个二维矩阵,再以列优先输出即可
        代码:           
 
2013        Symmetric Order          简单题
算法:            i从1开始每隔2就输出该字符串(i0)
代码:           
 
2606        Rabbit Hunt                  简单的几何题
算法:            算出每个顶点与其他顶点的斜率并记录其斜率相等的个数的最大值,输出即可
代码:           
 
3390        Print Words in Lines      线性DP
              算法:            用d[i]表示打印前i个字符的最优解,则其动归方程为:
                                   d[i]=min{d[j]+cost(i,j)},cost(i,j)表示从j到i打印在一行的代价
代码: #include 
#include 
·                using namespace std;
·                const INF=100 000 000;
·                int len[10 001],min[10 001];
·                 
·                int main()
·                {
·                      int c,m,n;
·                      scanf("%d",&c);
·                      while(c--)
·                      {
·                            scanf("%d%d",&m,&n);
·                            for(int i=0;i
·                                  scanf("%d",&len[i]);
·                            min[0]=pow((m-len[0])*1.0,2);
·                            for(i=1;i
·                            {
·                                  int tmp=len[0];
·                                  for(int j=1;j<=i;j++)
·                                        tmp+=len[j]+1;
·                                  if(tmp>m)
·                                        min[i]=INF;
·                                  else
·                                                                                                                                                   min[i]=pow((m-tmp)*1.0,2);
·                                  tmp=0;
·                            
·                                  for(j=1;j<=i;j++)
·                                  {
·                                        if(tmp!=0)tmp++;
·                                        tmp+=len[i-j+1];
·                                        if(tmp>m)break;
·                                                                                                                       if(min[i]>min[i-j]+pow((m-tmp)*1.0,2))
·                                                                                               min[i]=min[i-j]+pow((m-tmp)*1.0,2);
·                                  }
·                            }
·                            printf("%d/n",min[n-1]);
·                      }
      return 0;
}
2007 9 30 星期日      (22)
 
3399        Product          简单题,但自己却WA了n次
              题意:            给出n个数,要求从中取k个数使得它们的乘积最大
算法:                   1:当全为负数时候,若k为奇数,则取最大的k个;否则,取最少的k个;2:有正有负或全为正的时候,若k为奇数,先取最大的正数,然后从两头开始每两个的取,并选之中乘积较大的两个
代码:           
 
1862        Stripies          简单的数学题
题意:            给出一列数,每次去两个最大的数(均值不等式)按公式2*sqrt(m1*m2)合并为一个数,到最后只剩下一个数并输出即可!
算法:            无,只是要特别考虑只有一个数的时候
代码:           
 
NUAA1111                    典型的DP—01背包问题
              题意:            实质就是01背包问题
              算法:            动归方程:dp[i]=max{dp[i-weight]+value}
              代码:            如下:
 
#include
using namespace std;
 
struct node
{
       int weight;
       int value;
}a[101];
 
int n,m,s[101],dp[2001];
 
int main()
{
       int i,j,k,sum;
       while(scanf("%d",&n)==1)
       {
              for(i=0;i
                     scanf("%d",&s[i]);//记录各容器空间
              scanf("%d",&m);
              for(i=0;i
                     scanf("%d%d",&a[i].weight,&a[i].value);
              memset(dp,0,sizeof(dp));
              for(i=0;i<2001;i++)
                     for(j=0;j
                     {
                            k=a[j].weight;
                            if(i>=k&&dp[i]
                                   dp[i]=dp[i-k]+a[j].value;
                     }
              sum=0;
              for(i=0;i
                     sum+=dp[s[i]];
              printf("%d/n",sum);
       }
       return 0;
}
 
2007 10 1 星期一      (24)
 
2389        Bull Math              简单的大数相加
              题意:            给出两个数,要求它们的和
              算法:            大数相加              
代码:            for (i = 0 ;i <lena ;i ++)
·                            for(j=0;j
·                            {
·                                  c[i+j]+=a[i]*b[j];
·                                  c[i+j+1]+=c[i+j]/10;
·                                  c[i+j]%=10;
·                            }
·                        if(c[i+j-1]!=0)lenc=lena+lenb;
              else lenc=lena+lenb-1;
 
2371           Questions And Answers
题意:   给出一个数组,要求排序后按给定的下标输出
算法:   
        代码:      
 
2007102星期二      (25)
 
1731 Orders      STL解决的简单题
      题意:   给定一个字符串(最长为200个字符串),输出其全排列
      算法:       next_permutation()prev_permutation()求组合数,但注意要先排序,包含在algorithm里面,其中还有sort(),好用!
      代码:cin>>s;
·                      int len=strlen(s);
·                      sort(s,s+len);
·                      cout<
·                      while(next_permutation(s,s+len))
                  cout<
 
 
2007103星期三      (29)
 
1256 Anagram     跟组合有关的题目
      题意:   给出一个字符串,要求输出所有排列组合数,但顺序是A
      算法:   nest_permutation()的另一种用法
      代码:
#include 
#include 
#include 
using namespace std;
 
class order
{
public:
    bool operator() (char x, char y)
    {
          if (x == y)
              return x < y;
          if (x == y + 32 || y == x + 32)
              return x < y;
          if (x >= 'A' && x <= 'Z')
              x += 32; 
          if (y >= 'A' && y <= 'Z')
              y += 32;
          if (x != y)
              return x < y;
    }
};
 
int main()
{
    int m;
    cin >> m;
    string x;
    string y;
 
    for (int i = 0; i < m; ++i)
    {
          cin >> x;
          sort(x.begin(), x.end(), order());
          cout << x << endl;
          y = x;
          while(next_permutation(x.begin(), x.end(), order()))
          {
                if (y != x)
                cout << x << endl;
              y = x;
          }
    }
    return 0;
}
 
1833 排列     有一个关于组合的问题
      题意:   给出一组数,输出从该组合开始的第k组合数
      算法:   next_permutation()
      代码:   
 
1146 ID Codes          组合
      题意:   一个字符串,存在下一个排列的,输出,否则,输出“NO..”
      算法:   next_permutation()
      代码:   
 
2245 Lotto   组合问题
      题意:   给出一组数(613个),把其中由6个数组成的序列按从小到大顺序输出
      算法:   超暴力,六个for循环
      代码:   
 
2007104星期四      (30)
 
1141 Brackets Sequence动态规划之记忆化搜索
      题意:       给出以列括号’(‘,’)’,’[‘,’]’,其中’()’,’[]’是规则序列,若AB是规则序列,则’(A)’,’[A]’AB也是规则序列,现在问对于所给出的括号序列,问最少添加几个括号,使之成为规则序列
      算法:   记忆化搜索(DP
      代码:       D:/program/1141/1141.cpp
 
2007105星期五      (31)
 
2136 Vertical Histogram简单题
      题意:       给出一个大写的字符串序列,计算各个字符出现的次数,并打表输出,注意不能输出多余的空格(WAn次)
      算法:   就是要注意不能输出多余的空格即可
      代码:   
 
2007108星期一      (32)
 
2405 Beavegnaw   简单的数学题
      题意:   已知圆台的底直径D和体积V,求上直径d,台高为D-d 
      算法:   就一个圆台体积公式
      代码:   
 
2007109星期二      (34)
 
2737           Swamp Things
题意:   给出nn<1000)个点,算出最多的共线的点(不少于4,如果少于4,输出0
算法:        for i:0 to n-max 确定一个顶点,并算出与其余各点的斜率(如此即可保证只要斜率相等就一定共线),记下过这点的直线族中顶点最多的数目max
代码:   D:/program/2737/2737.cpp
 
2738           Two Ends
题意:   两个人(假设是player1player2)玩游戏,给出一列数,要求必须从数组的两头开始取,player1先取,接着player2采用贪心法,即取数组两头中较大的那个数,如此取法直至把所有的数取完,要求使得player1-player2的值最大
算法     记忆化搜索(DP
             Player1=max{
            a[low]+
            max{solve(low+2,high),solve(low+1,high-1)},
            a[high]+
            max{solve(low,high-2),solve(low+1,high-1)}
                   }
代码:   D:/program/2738/2738.cpp
 
20071010星期三     (36)
 
2033 Alphacode         动态规划之记忆化搜索
      题意:              A,B,C…..X,Y,Z分别对应123…..242526,现在给出一个数字串,问有几种翻译的方法
      算法:   记忆化搜索
      代码:
      int solve(int i)
·                {
·                      int tmp=0;
·                      if(i>=len)return 1;
·                      if(dp[i]!=0)return dp[i];
·                      if(s[i]>'2'||(s[i]=='2'&&s[i+1]>'6'))
·                            tmp=solve(i+1);
·                      else if((s[i]=='2'||s[i]=='1')&&s[i+1]=='0')
·                            tmp=solve(i+2);
·                      else if(s[i]=='1'||(s[i]=='2'&&s[i+1]<='6'))
·                      {
·                            if(i+2<=len)
·                                  tmp=solve(i+1)+solve(i+2);
·                            else if(i+1<=len)
·                                  tmp=solve(i+1);
·                      }
·                      dp[i]=tmp;
            return tmp;
      }
 
1118 Lining Up         简单的几何题
      题意:   给出一列点,问共线的最多点数(与2606一样)
      算法:   算出斜率,排序,搜一遍即可
      代码:   
 
20071011星期四     (37)
 
2036 I Conduit         几何题,有点麻烦
      题意:              可以抽象为:给出n条线段(n<=10000),若任意两条线段平行且有交点,则可以把两条线段合并为一条,问最后剩下有几条?
      算法:   按线段的斜率、与y轴的截距、最小的x轴坐标、最小的y轴坐标从小到大排序,再搜一遍即可
      代码:   
 
20071014星期日     (38)
 
1045 Bode Plot         简单的物理题(如果知道公式的话)
      题意:   给出几个已知量和两个要用到的公式要求推算出另一变量的值
      算法:   
      代码:   
 
20071015星期一     41
 
2092 Grandpa is Famous简单题
      题意:   给出一串数字,要求输出出现次数第二多的数,如果超过一个,就从小到大输出
      算法:   快排
      代码:   
 
2260 Error Correction 简单题
      题意:   给出一个布尔(0 1)数组,若每行每列的和都是2的倍数,则输出OK;否则,若只是通过改变数组中的一位就使得数组满足上述条件,输出相应的操作;否则,输出Corrupt
      算法:   在判断只改变一位就满足条件的时候,只要找出不满足条件的第一行i,然后在该行中的各列寻找不满足条件的列j,修改该位后再判断是否满足即可
      代码:   
 
3359 Wordfish           简单的排列组合题
      题意:   给出一个大写的不超过21个字符的字符串,往前和往后各生成10个字符串,然后在这21个字符串当中的找出一个最大的相邻字符的绝对值只差最少的字符串,然后输出该串和该数字即可
      算法:   next_permutation()和prev_permutation()
      代码:   
 
20071016星期二     42
 
3421 X-factor Chains    数学题
      题意:   给定一个数m,要求最长序列1x1x2….m,其中x2可以被x1整除,问这样的最长序列有几个?
      算法:   算出m可被哪些素数整除和各个素数在这里出现的次数,假设m可被整除n次,而每个素数出现的次数为c1c2...那么,这样的序列的个数num=n!/c1!*c2!*..
      代码:   
 
20071017星期三   44
 
3278 Catch That Cow    简单的搜索题
      题意:   x轴的正半轴上,给定人和奶牛的坐标nk,而人有三种走法:1):往前走一步,2):往后走一步,3):从n跳到2*n,但若人在奶牛的右边,那么人只能一步一步的往回走,现在问人要抓到奶牛最少要走的步数!
      算法:    广搜,范围不大,才100000,设个标志数组即可
      代码:   
 
1113 Wall    典型的凸包(第一个凸包)
      题意:   有一个宫廷,要求用最短的墙围起来,但墙离宫廷的距离不能少于一个给定的值
      算法:   凸包,
      代码:   
 
20071018星期四     45
 
2187 Beauty Contest    典型的凸包(第二个凸包,我要找第三个!!!)
      题意:   给定一堆点,要求出任意两点之间的最大距离(严格的说是距离的平方)
      算法:   凸包Graham-Scan,算出外围的点之后,求任意两点的距离,取最大的即可(据说还有优化的方法!我这是最笨的^_^
      代码:   
 
20071019星期五     50
 
2941 Homogeneous Squares            数学题
      题意:   一个行列数为n的二维数组,如果每n个不同行不同列的数的和都相等,则输出YES,否则…..
      算法:   如果跟对角线平行的每行数的和都相等,则可认为是相等的,这样做就AC了,但不能证明其正确性
      代码:   
 
2940 Wine Trading in Gergovia贪心题
      题意:   一个城镇里每户人家(房子都在一条直线上)都提供酒或需要酒,并且供需平衡,已知相邻两户人家每搬运一个单元的酒就需要k个单元的劳动力,现在问该如何搬运使得所需的劳动力最少
      算法:   非常典型的贪心:从第一户人家开始,不管其是供还是需x,都必须在第一户和第二户之间搬运x单元的酒,此时合并这两户人家,假设其需或供y单元的酒,则再与第三户人家比较时候,要搬运y单元的酒,如此下去,直至第n户人家】
      代码:while(n--)
·                        {
·                            int x;
·                            scanf("%d",&x);
·                            x+=rest;
·                            total+=abs(x);
·                            rest=x;
             }
 
2864 Pascal Library    菜题
 题意 :   n个人,举行过d次活动(筹款晚宴),用一个dn列的二维数组表示其出席情况,出席了为1,否则,为0,现在问有没有至少一个人出席了全部的活动
 算法:   
 代码:   
 
 
2159 Ancient Cipher    看起来蛮吓人的,其实是菜题,理解题意万岁!
      题意:   有两种加密的方法:1):替换,即用另一个字符替代这个字符,2):排列组合,即把该字符串的顺序搞乱。现在给出一个密码和一个猜测的答案,问可否由密码按照某种方法得到那个猜测的答案
      算法:   看两个字符串中相同字符出现的次数是否相等即可
      代码:   
 
1565 Skew Binary数学菜题
      题意:   有一种二进制表示方法:即从最后一位开始往前的第一个非零数字可以为2,现在给出这样的一个二进制数,要求输出其十进制形式
      算法:   
      代码:   
 
20071020星期六    52
 
1228 Grandpa’ Estate   凸包
      题意:   爷爷的庄园是用一些插在地上的一些圆柱围起来使得能够和别人的庄园区分开来,但因年久失修,有些圆柱已经不见了,现在问能不能够从剩下的这些圆柱中唯一的确定庄园?
      算法:   典型的凸包,由题意可知这些圆柱都是凸包上的点,而从这些点来唯一的确定庄园,必须是凸包边上都必须由三个或以上的点,因为如果只有两个点,那么我们一点可以再添一个点,使得这个点和原来的这些点组成一个更大的凸包,也就是说凸包不唯一!
      代码:   
 
2301 Beat the Spead    绝对的菜题!
      题意:   给定两个数,如果第一个数大于第二个数,则一次输出两数的差的二分之一和两数和的二分之一,否则,输出impossible
      算法:   
      代码:   
 
20071021星期日    54
 
3425 Customer support 简单的数学题
      题意:   客户每问一个问题:如果得到一个错误的回答,收费10¥;如果只是得到一个正确的答案,收费20¥;如果得到一个正确的答案并且有解释,收费40¥;如果问的问题已被正确回答过n次,则营收费40+n*10¥,现在要求输出一个月的收入
      算法:   
      代码:   
 
3427 Ecology tax理解好题意,其实也是菜题
      题意:   一个森林有n棵高度已知的树,树每年长高一米,有一个采伐公司到这个森林里伐木,这个公司的汽车每次可以运走长度为l的圆柱,所以必须把每棵树都截成长度为l的圆柱,而剩下的就是浪费掉的,而该国家有规定,浪费木材是要受罚的,而且受罚的程度和浪费的程度成正比,现在要问公司应该在那一年采伐可使受罚的最低?
      算法:   只要看哪一年的树的高度是l的倍数的数目最大即可(只要在0-l之间寻找即可)
      代码:   
 
 
20071022星期一    56
 
2051 Argus   数学题,看起来规模蛮吓人,强暴力过的
      题意:   有点难懂,呵呵,就是把一个数轴上的一些点初始化为一个值,而这些被初始化的点的倍数也是这个值,现在要求出最早出现的n个值,如果在一个点上有超过一个的值,按值从少到大输出
      算法:   暴力
      代码:   
 
2546 Circular Area     数学题
      题意:   求两个圆的重叠部分的面积
      算法:   无,就是要非常的小心!
      代码:   
 
20071023星期二    58
 
1654 Area     几何题
      题意:   求多边形的面积
      算法:   叉积求面积
      代码:   
 
1183 反正切函数的应用     数学题
      题意:   中文题,意思很好懂!
      算法:   1/a = (1/b+1/c) / (1 - (1/b) * (1/c))
                 1/a = (b+c)/bc / (1-1/bc)
                 a = (bc-1) / (b+c)
                  令 m = b+c
                  则 c = m - b;
                  m = (b^2+1)/(b-a)
                  令 i = b-a
                  则 m = i + 2a + (a^2+1)/i    //最后表达式
                  i+ (a^2+1)/i >= 2*sqrt(a^2+1)
                 所以: i >= sqrt(a^2+1) 或 i<= sqrt(a^2+1)
                  则 m >= 2*sqrt(a^2+1) + 2a
                 所以可以令 i 从 a 开始循环 i--;
               直到 (a^2+1)%i == 0 再求出m即可
      代码:    
 
20071025星期四     59
 
3435 Sudoku Checker    菜题一个
      题意:    就是看看一个矩阵里面的每个小矩阵里面的数字有没有重复
      算法:    暴搜
      代码:    
      教训:   这题WAn次,原因在于自己偷懒不看题目!
 
      
20071026星期五     60
 
1019 Number Sequence   数学题
      题意:   一个数字排列,即1121231234…..,给定一个数nn刚好在一个整数范围里),要求输出第n位数字
      算法:   利用函数ltoa(num,str,radix)把相应的数字转化为字符串,然后再逐个数即可
      代码:   
      辅助:   这两天堕落了,一直没做题,敲响警钟!!!
 
20071029星期一     63
      
3096           Surprising Strings字符串问题
题意:              给定一个字符串(长度不超过80),以两个字符下标的差值(123..)分组,并以这些长度为2的字符串为组的元素,如果在任意一组里面有相同的字符串,则为surprising,否则是 not surprising
        算法:      暴力,规模不大,好像还是0ns
        代码:      
 
3100 Root of the Problem            数学题
      题意:   给定两个数b(b<1000000)n1<=n<=9,现在要算出an次幂与b最接近的a
      算法:   暴力,规模虽然有点大,稍微剪一下枝就过了
      代码:   
 
3095 Linear Pachinko   模拟题
      题意:   就一个模拟
      算法:   模拟
      代码:   
 
20071030星期二     66
 
3348 Cows    凸包
      题意:              一个农场里有很多的树,现在要以这些树作为支点来围一个面积最大的牧场,已知一只羊至少需要50平方米的草场,问最多可以养几只羊??
      算法:   凸包
      代码:   
 
1274           The Perfect Stall
题意:              一个牧场里面有n只奶牛和m个挤奶场,其中一头奶牛可能到一个或几个挤奶场,现在问一次最多能有几个挤奶场同时在使用当中
        算法:      最大匹配
代码:   
 
1455           Crazy tea Party
      题意:   n个人出席并围成一圈的茶会,相邻两个人可以互换位置,现在问最少经过几次交换以后可以使得原来在左边的人跑到右边去
      算法:求逆序数:若是线形无环,将1-n变为n-1,求逆序数n*(n-1)/2即可(线性代数)但本题由于是环,则在1-n中取一k,将1-n变为形如k-1,n-(k+1)也可满足条件,比如1,2,3,4,5变为3,2,1,5,4也可满足条件。问题转换为只需确定一k,使逆序数最小。设一k,对于k-1和n-(k-1)分别求逆序数:k-1:k*(k-1)/2n-(k+1):(n-k)*(n-k-1)/2则总共的逆序数为k*(k-1)/2+(n-k)*(n-k-1)/2,根据一元二次方程最低点(-b/2a)求得当k=n/2时该式最小
        代码:略
 
20071031星期三     68
 
3438           Look and Say
题意:   把看到的一个数字串用说的方式表达出来,如:123就是说            有一个一,一个二,一个三,所以结果是111213
算法:   模拟题吧
        代码:      
 
3445           Elementary Additions
题意:              数字的用大括号来表示(详见题目),要求输出两个数的和
        算法:      打表
代码:   
 
 
2007111星期四      71
 
1939 Diplomatic License数学题
      题意:   很多的国家之间需要互相的通信,而这些国家所在的位置围成一个圆圈,假设每两个相邻的国家需要在一个地方开会,已知每个国家去开会的人每走相同的距离的价钱是一样的,现在要求找出最合适的开会的地方?
      算法:   其实就是算每两个相邻国家(注意:第一个国家和最后一个国家是相邻的)之间的中点
      代码:   
 
1936           All In All
题意:              给出两个字符串st,问s是否可以从t中通过去掉一些字符来得到
        算法:      暴搜
        代码:      
 
1942           Paths on Grid
题意:              给出一个n*m的矩阵,有两种走法:一是往右走,二是往上走,现在问从左下角到右上角有几种走法
        算法:      T路的计数,即(n+m)!/n!*m!
代码:  
附注:   T路的计数还没找到相关的资料
 
2007114星期日      73
 
2140 Herd Sums         数学题
      题意:     给一个整数n,问有几种方法可使几个连续的数的和等于n
      算法:    k=(sqrt(1+8*n)-1)/2,即子序列的长度不会超过k. 接着从1到k一个一个判断 a=(2*n-k*k+k)%(2*k)是否为0,如果是则总数加1,否则继续循环.
        代码:    
        附注:    数学功底太差了,搞本组合数学研究研究!
 
1922    Ride to School         数学题
        题意:                 Charlie骑车从公寓到教室,首先在公寓门口等同学,当有同学来就跟着他走,如果在路上有比原来这个同学更快,就又跟着他走,问Charlie什么时候到教室
        算法:    简单的数学题
        代码:    
 
2007115星期一      76
 
1466 Girls and Boys    匹配
      题意:   n个学生里面(没有说明那个是男那个是女),给出每个学生可能的发展对象,问不可能成为情侣的学生的个数?
      算法:   算出最大匹配数m,答案是n-m/2
      代码:
      bool can(int t)
·                {
·                      for(int i=0;i
·                            if(used[i]==0&&mat[t][i])
·                            {
·                                  used[i]=1;
·                                  if(link[i]==0||can(link[i]))
·                                  {
·                                        link[i]=t;
·                                        return true;
·                                  }
·                            }
·                      return false;
·                }
·                 
·                int MaxMatch()
·                {
·                      int count=0;
·                      memset(link,0,sizeof(link));
·                      for(int i=0;i
·                      {
·                            memset(used,0,sizeof(used));
·                            if(can(i))count++;
·                      }
          return count;
      }
 
1469 COURSES     匹配
      题意:       n个学生,p门课程,给出每个学生可以上的课,问是否存在同时有p个学生在分别上这p门课程
      算法:就一个匹配
      代码:见上
 
2239 Selecting Courses匹配
      题意:李明在开学时候选课,已知有n门课程,其中这n门课可能不止讲一次,但就是时间不同。李明很爱学习,请你帮他安排时间选尽可能多的课
      算法:还是一个匹配
      代码:
20071110星期六     77
1422 Air Raid           匹配
	题意:   一个城市的街道全是单向的,其中每两个十字路口都有一条通路连接,现在给出这些十字路口的通路情况,问最少只要几个人即可把所有的十字路口都走遍
	算法:   匹配算法
         代码:   
20071112星期一     81
2403 Hay Points        简单题
	题意:   已知具备某些才能的一个工人需要工钱若干,现在一个公司要招聘一个工人,其中列出这个工人所必须的才能,问要付给这个工人多少工钱
	算法:   
	代码:   
1330 Nearest Commen Ancestors简单题
	题意:   给出一棵树各顶点的连接情况,每个顶点有相应的一个序号,从树根到给出的两个顶点的通路的各顶点中,求离这两个顶点最近的一个顶点
	算法:   用一个一维数组(滚动数组)记录相应顶点的父节点,求出两个顶点的通路后直接找出最近的那个即可
	代码:   略
2533 Longest Ordered Subsequence    DP
      题意:   求一个序列的最长递增子序列
      算法:   简单的DP
      代码:   
1887           Testing the CATCHER
	题意:   求一个序列的最长递减子序列
         算法:      简单的DP
         代码:      
 
      
      
 

你可能感兴趣的:(ACM_PKU)