CUGB第四届程序设计大赛解题报告
比赛链接:
http://acm.cugb.edu.cn/JudgeOnline/showcontest?contest_id=1038
A题   医院的灯

水题,只有4盏灯,1到4查找灯的状态,遇到1(明)就输出再break;如果查

找到4还是0(暗)的状态,就输出-1

我没考虑-1WA了一次,然后没改Main CE了一次,一不小心一个小时就没了,

郁闷!

代码:
import java.io.*;
import java.util.*;

public class a {
public static void main(String args[]) {
   int a,b,c,d;
   Scanner cin = new Scanner(new BufferedInputStream

(System.in));
   while(cin.hasNext()) {
    a=cin.nextInt();
    b=cin.nextInt();
    c=cin.nextInt();
    d=cin.nextInt();
    if(a==1) {

     System.out.println("L1");
     continue;
    }
    if(b==1) {

     System.out.println("L2");
     continue;
    }
    if(c==1) {

     System.out.println("L3");
     continue;
    }
    if(d==1) {

     System.out.println("L4");
     continue;
    }
    System.out.println ("-1");
   }
}
}

B题: 僵尸农场大致是给你N*N块土地的状态,然后统计金币总额,注意:这里

只有植物(或者僵尸)为"ripe"的状态下,才把金币加上去,同时先假设心情

为高兴(flag=0),如果遇见状态为"withered", 则f=1;

import java.io.*;
import java.util.*;
import java.math.*;

public class b {
public static void main(String args[]) {

   int a,b,c,d,flag,money,i;
   String s;
   BigInteger x;
   Scanner cin = new Scanner(new BufferedInputStream

(System.in));
   while(cin.hasNext()) {
    a=cin.nextInt();
    money=0;
    flag=0;
    for(i=0; i<a*a; i++) {
     s=cin.next();
     if(s.equals("None")) {


     } else if(s.equals("Plant") ||

s.equals("Zombie")) {
      s=cin.next();
      if(s.equals("growing")) {
       b=cin.nextInt();
      } else if(s.equals("ripe"))

{
       b=cin.nextInt();
       money+=b;

      } else if(s.equals

("withered")) {
       b=cin.nextInt();
       flag=1;
      }
     }

    }

    if(flag==0)
     System.out.println("DSHAN is happy

and she has just earned "+money+" Gold.");
    else
     System.out.println("DSHAN is

depressed and she has just earned "+money+" Gold.");
   }
}

}

C题:wildfire很水,用set stl,自带排序去重功能,再用set迭代器输出
因为我不会java的stl,所以用c++写

#include<cstdio>
#include<iostream>
#include<set>
using namespace std;
int main(){
unsigned int t,tt;
int a;
while(scanf("%d",&t)!=EOF)
{
   set<int> s;
   for(tt=0;tt<t;tt++)
   //while(t--)
   {
    scanf("%d",&a);
    s.insert(a);
   }
   printf("%d\n",s.size());
   set<int>::iterator it;//定义前向迭代容器
   it=s.begin();
   cout<<*it;
   for(it=++s.begin();it!=s.end();it++)
   {
    cout<<" "<<*it;
   }
cout<<endl;
}
    return 0;
}

D题:(哈尔滨现场赛的题目)贪心算法,排序,正逆相加即可

#include<iostream>
#include<algorithm>
using namespace std;
int a[1010],b[1010];
int main(){
int t,tt,n,x;
int s,ans;
while(scanf("%d%d",&n,&x)!=EOF)
{
   for(tt=0;tt<n;tt++)
   {
    scanf("%d",&a[tt]);

   }
   for(tt=0;tt<n;tt++)
   {
    scanf("%d",&b[tt]);

   }
   sort(a,a+n);
   sort(b,b+n);
   ans=0;
   for(tt=0;tt<n;tt++)
   {
    s=a[tt]+b[n-tt-1]-x;
    if(s>0)
     ans+=s;
   }
   printf("%d\n",ans);
}
    return 0;
}


E题:状态传递,再加上点floyd算法求解,(floyd在求最短路上的优势在于,

可以一次性求解多个最短路,不好的是耗时),先初始化d[i][j]=0; 若a比b

强,则d[a][b]=1; d[b][a]=2(表示b比a弱);代码:

import java.io.*;
import java.util.*;
import java.math.*;

public class f {
public static void main(String args[]) {
   BigInteger[] h=new BigInteger[65];
   h[0]=BigInteger.ONE;
   h[1]=BigInteger.ONE;
   for(int i=2;i<61;i++)
    h[i]=BigInteger.ZERO;
   for(int i=2;i<=60;i++)
    for(int j=0;j<i;j++)
     h[i]=h[i].add
      (h[j].multiply(h[i-j-1]));
  
  
   int a,b,c,d;
   BigInteger x;
   Scanner cin = new Scanner(new BufferedInputStream

(System.in));
   while(cin.hasNext()) {
    a=cin.nextInt();
   
    if(a==0) {
     break;
    }
   
    System.out.println (h[a/2]);
   }
}

}

F题:地大恐龙博物馆买票问题:裸的Catalan数
我的算法不怎么样,递归式:
  h(n)=((4*n-2)/(n+1))*h(n-1);比较好
代码:
import java.io.*;
import java.util.*;
import java.math.*;

public class f {
public static void main(String args[]) {
   BigInteger[] h=new BigInteger[65];
   h[0]=BigInteger.ONE;
   h[1]=BigInteger.ONE;
   for(int i=2;i<61;i++)
    h[i]=BigInteger.ZERO;
   for(int i=2;i<=60;i++)
    for(int j=0;j<i;j++)
     h[i]=h[i].add
      (h[j].multiply(h[i-j-1]));
  
  
   int a,b,c,d;
   BigInteger x;
   Scanner cin = new Scanner(new BufferedInputStream

(System.in));
   while(cin.hasNext()) {
    a=cin.nextInt();
   
    if(a==0) {
     break;
    }
   
    System.out.println (h[a/2]);
   }
}

}
G题:包子的密码;求亲和数,又是数论题,题目四秒,我的暴力30秒左右,没

心思优化,直接打表:
另外这题输出让我费了不少功夫,sprintf用的不熟,呵呵,不过早知道打表

就无所谓了
代码:
#include<cstdio>
//#include<cmath>
#include<iostream>
#include<string>
using namespace std;
int a[27][2]={ {220,284},{1184,1210},{2620,2924},{5020,5564},

{6232,6368},{10744,10856},{12285,14595},{17296,18416},

{63020,76084},{66928,66992},{67095,71145},{69615,87633},

{79750,88730},{100485,124155},{122265,139815},{122368,123152},

{141664,153176},{142310,168730},{171856,176336},{176272,180848},

{185368,203432},{196724,202444}};
int main()
{

int a1,a2,b,i,j,cas=0;
char ii[20];
string iii,str;
scanf("%d%d",&a1,&a2);
if(a1>a2)
{
   b=a1;
   a1=a2;
   a2=b;
}
for(i=0; i<=22; i++)
{
  
   if(a[i][0]>a1 && a[i][1]<a2)
   {
    cas++;
    sprintf(ii,"%d %d\n",a[i][0],a[i][1]);
    iii=ii;
    str+=iii;
   }
}
printf("%d\n",cas);
cout<<str;
//system("pause");
return 0;
}

后面的题目都没看(没时间,估计也做不出来)
下文转自http://user.qzone.qq.com/277930484/
H题: 锄大地(其实跟打牌毫无关系)无非是找数字规律,推公式了,这是题

目的数据:1张牌:不计分 2-7张牌:n分 8-9张牌:2n+7分 10-12张牌:3n

+2*9+7 13-16张牌:4n+3*12+2*9+7 17-21张牌:5n+4*16+3*12+2*9+7 可以发

现区间段的数字个数为 2,3,4,5,6....(从数字8开始);可以发现得分的常数

项为7,2*9+7,3*12+2*9+7,....(从数字8开始):每一个常数项和上一个数段

的最后一个得分结果相同!!!;可以发现系数为:2,3,4,5,6.....;接下来

,就是你的代码实现问题了代码:#include<stdio.h>
int Case;
__int64 d[1501];
void p()
{
    int i,j,s,k,t;
    d[0]=d[1]=0;
    t=2; s=7; k=7;
    for(i=2;i<=7;i++)
        d[i]=i;
    for(i=8;i<=1500;i++)
    {
        d[i]=i*t+s;
        if(i==k+t)
        {
            k+=t;
            s=d[i];
            t++;
        }
    }
}
int main()
{
    int j,a,b,c,A=0,B=0,C=0;
    p();
    scanf("%d",&Case);
    for(int i=1;i<=Case;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        printf("Case %d:\n",i);
        printf("Leefour:%I64d\n",d[a]);
        printf("Eli_love:%I64d\n",d[b]);
        printf("Pmonkey:%I64d\n",d[c]);
        A+=d[a]; B+=d[b]; C+=d[c];
    }
    __int64 min=-1;
    j=0;
    if(A>min){min=A; j=1;}
    if(B>min){min=B; j=2;}
    if(C>min){min=C; j=3;}
    if(j==1) printf("Leefour ");
    else if(j==2) printf("Eli_love ");
    else if(j==3) printf("Pmonkey ");
    printf("lose!\n");
    return 0;
}


总结:
java不是很熟练,所以写水题的速度不行
java的类库用了解的太少
java细节小错误导致浪费时间调试的事情屡有发生

?CUGB第四届程序设计大赛解题报告 - 橙衣少年 - 跟着我勇敢地走下去

java效率实在不行,正式比赛还是cpp比较靠谱,如图