题目链接:http://vjudge.net/problem/viewProblem.action?id=32629
这道题目,水!!!但做的我想骂街,训练赛的时候一直想着,这么水的题如果不A掉,怎么好意思往下面做。然而就是这道题,把我死死卡住了,各种各样的问题,有的都是我之前没有遇到的错误,难怪搞ACM的很少人使用 Java 编写代码,太TM变态了。
下面是我解决这个问题中遇到的所有错误,为以后提个醒吧。
其实这道题目首先我考虑错了,用到了栈,利用它的FILO性质,把不符合条件的压入栈,符合条件的进行运算,然后以栈是否为空判断输出结果:
//错误原因:因为栈是单方向出栈的,存在一种情况,当对阵 a 怪兽的时候,力量不足不能击败,所以 a 怪兽入栈,进行 a 下面
//的 b 怪兽判断,同样不能击败, b 怪兽入栈,接着进行 c 怪兽判断,能击败,力量值增加,但不能击败 b 怪兽......一直到最
//后一组数据的判断结束,都不能击败 b 怪兽,这种情况下,栈中还存在 a 和 b ,所以输出结果为 “NO”,但实际上,判断到最
//后时,Kirito的力量已经可以击败 a 怪兽了,击败 a 之后,力量值增加,以至于可以击败 b 怪兽,所以实际结果应该是 “YES” !!!
import java.util.*;
public class Main {
/**
* @param args
*/
static final Scanner scan=new Scanner(System.in);
static int S,n,sum;
static int x,y;
static Node[] N=new Node[1010] ;
static Stack
st=new Stack
();
static class Node{
int x,y;
Node (int x,int y){
this.x=x;
this.y=y;
}
}
public static int dfs(Node s){
st.push(s);
while(!st.empty()){
Node u=st.pop();
if(u.x>=S){
st.push(u);break;
}
else{
S+=u.y;
}
}
return 0;
}
; public static void main(String[] args) {
// TODO Auto-generated method stub
int i=0;
S=scan.nextInt();
n=scan.nextInt();
scan.nextLine();
while(n--!=0){
x=scan.nextInt();
y=scan.nextInt();
scan.nextLine();
N[i++]=new Node(x,y);
}
for(int j=0;j
错误1:Source Code Error
其实这个错误如果长时间用 java 搞ACM的完全可以避免,ACM 要求java代码只能有一个类,即 public class Main{ ........},如果在这个类外又定义的一个新类就会出现这个错误,把新定义的类放到Main类下即可,以为我是第一次遇到这个错误,所以当时感觉无从下手,不知道怎么解决,网上也没有找到答案,还是经过好心的队长提醒才发现这个错误。
错误2:
Compilation error
这个问题经常遇到,但错误的地方出乎我的意料
//代码段1
static class Node
{
int x,y;
Node(int x,int y){
this.x=x;
this.y=y;
}
}
static final Scanner scan=new Scanner(System.in);
static int s,n,x,y;
static Node[] N;
public static void sort(Node[] a,int t){ // 错误位置1
for(int i=0;i
a[i+1].x){
Node tmp=a[i];
a[i]=a[i+1];
a[i+1]=tmp;
}
}
}
//代码段2
for(int i=0;i
N[i+1].x){
Node tmp=N[i];
N[i]=N[i+1];
N[i+1]=tmp;
}
}
错误1处是由于GDK编码问题,错误2处却实在不知道什么原因,我把 i < n - 1;处用 t = n - 1; i< n - 1;替换后,错误消失,很是纳闷。
另外,Eclipse编写Java时,它会时不时的抽下风,在创建扫描器 Scanner 对象的部分( Scanner scan = new Scanner(System.in) ),有时会出现创建的扫描器对象没有关闭的警示,最好不要管他,因为你一旦重视了它,在后面添了一句 scan.close() 语句,那提交的时候,就会连第一个测试数据都过不了。
其他还有一些大大小小的问题,都是一些常见问题,只要稍加注意就可避免。
下面是我AC的Java代码:
import java.util.*;
public class Main
{
static class Node{
int x,y;
Node(int x,int y){
this.x=x;
this.y=y;
}
}
static final Scanner scan=new Scanner(System.in);
static int s,n;
static int x,y;
static Node[] N=new Node[1010];
public static void main(String[] args)
{
s=scan.nextInt();
n=scan.nextInt();
for(int i=0;i
N[j].x){
Node tmp=N[i];
N[i]=N[j];
N[j]=tmp;
}
}
}
for(int i=0;i
N[i].x)
s+=N[i].y;
else{
System.out.println("NO");
return;
}
}
System.out.println("YES");
}
}
下面是看到的别人代码,只是读取数据的方式不对,他的方式避免了对回车键的意外读入,但增加了耗时,其实只要在我的代码中添加 scan.nextLine() 语句,同样可避免这个问题,贴他的代码只是用来学习下他的数据录入方式:
import java.util.Scanner;
public class Problem6 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//******************************************************************************************
String l1=in.nextLine(); //以字符串形式读取数据
String[] two=l1.split("\\ "); //以空格分离字符串
int s=Integer.parseInt(two[0]); //字符串转化为整形
int n=Integer.parseInt(two[1]);
//*****************************************************************************************
int[][] dims=new int[n][2];
for(int i=0;i
dims[i][0])
s+=dims[i][1];
else
return false;
}
return true;
}
}