CUGB第四届程序设计大赛解题报告
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细节小错误导致浪费时间调试的事情屡有发生
?
java效率实在不行,正式比赛还是cpp比较靠谱,如图