首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

求一个优秀算法,参加有分

2011-12-23 
求一个优秀算法,参与有分.基本需求如下:1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情

求一个优秀算法,参与有分.
基本需求如下:
1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情要做,但每人每次只允许做一件,并且从第一件开始做.

2.等到丁做完一件事后,休息1分钟,然后又从甲开始做剩下的事情,以此循环,直到四人都做完自己的所有事情.

以上为基本要求,附加扩展需求如下:
1.如果一件事做失败了,则记录它的做事者,以及失败原因,失败时间等,再输入到c:/note.txt,然后再跳过该件事,其它人继续进行.

2.当四人完成所有事情后,记录每人完成事情的所需的总时间以及成功率(或失败率),最好能用图表显示统计.

我想方法可能不少,但效率可能有别,此算法看似简单,但要运用的知识点却不少,线程,异常处理,循环应用,文件操作等等,
对一般人练练手应该还是有意义的啦.

大家有兴趣也来露两手如何?附加要求可以不考虑.本人的就不贴上去献丑了,呵

最后说下,本人认为该需求用于面试也不错,如果有人能在30分钟内完成,水平应该是相当不错的(使用时间越少,正确率越高,相对来说被面试者水平越高)
当然如果你认为是这是作业题或太简单了而不屑一顾的话,那你可以绕路了(此处已难以展现你才能了,人各有志吧,水平不同当然目标不同了,可以理解的,呵.)


[解决办法]
有四个人(甲乙丙丁)轮流做事情,

这就不用线程了吧?


[解决办法]
我完全不觉得这个跟线程有什么关系。。
[解决办法]
4个人。。
同意楼上用线程!!
[解决办法]
这样可不可以

Java code
public class FTest{    public static void main(String[] args) {        Logger log=new Logger();        People a=new People("甲", log);        People b=new People("乙", log);        People c=new People("丙", log);        People d=new People("丁", log);        for(int i=0;i<10;i++){            a.doMatter();            System.out.println("----pause-----1min----");            b.doMatter();            System.out.println("----pause-----1min----");            c.doMatter();            System.out.println("----pause-----1min----");            d.doMatter();            System.out.println("----pause-----1min----");        }        log.addTime(-1);        System.out.println(log);    }}class People{    private String name;    private int count;    private Logger log;    public People(String name,Logger log){        this.name=name;        this.log=log;    }    public void doMatter(){        System.out.println(name+"doing No."+(count+1));        int cost=(int)(Math.random()*5+1);        System.out.println("takes "+cost+" mins");        log.addTime(cost);        if(Math.random()>0.7){            log.addError();            System.out.println("fail!!");        }else{            System.out.println("success!!!");        }        log.addTime(1);        count++;    }}class Logger{    private int time;    private int error;    public void addTime(int time){        this.time+=time;    }    public void addError(){        error++;    }    public String toString() {        return "times:"+time+","+"errors:"+error;    }    }
[解决办法]
哇,靠,那么强
[解决办法]
关注中,顶楼主!
[解决办法]
帮顶,学习.
[解决办法]
设四个变量分别表示四个人完成的情况,然后再用wait(),notify(),应该可以啊
[解决办法]
汗~  关注中  帮顶 接分、、
[解决办法]
学习中!
[解决办法]
进来瞧瞧
[解决办法]

[解决办法]
这种些些小问题,楼主不是有些夸大吧?什么应聘之类的都扯上了,我虽然还没有毕业(不过都大四了),但是我看了下,找工作也不是那么容易的嘛!你这个问题其实没那么复杂,就是几个简单的语句在那里重用几下就行了,思路很简单的!我模拟了一个事件,假如是随机比较大小这样一件事!



import java.util.Random;
public class A{

public static void delays(int t){
int i=0;
for(i=0;i<t;i++);
//当然这里可以是线程的,由老板嘛!
}

public static void main(String args[]) {
 int i,j,k=0; 
 
 Random rand = new Random();
 
people peoples[]=new people[4];//找到这样四个数据库
 //下面这几句是给这 分配任务
 for(i=0;i<4;i++){
 peoples[i]=new people();
for(j=0;j<10;j++){
peoples[i].event_rand[j]=rand.nextInt(50)+30;
peoples[i].state[j]=0;

}
peoples[i].f[i]=0;
 }
 //现在是执行任务
int key=0,lock=0;

 while(true){
key=0;
for(i=0;i<4;i++){
for(j=0;j<10;j++){
if(peoples[i].state[j]==0){
key=1;
//具体任务是随机单挑,遇到比其大的数,算任务失败
if(peoples[i].event_rand[j]<rand.nextInt(80)){//这个SB本次任务执行不成功,给他记过一次
peoples[i].f[i]++;
//这里还可以记录更多的信息哦,比如具体件事
continue;
}else {
peoples[i].state[j]=1; // 这个SB本次任务执行成功 ,打个标记怕忘记了
continue;
}
}
}

}//for1
if(key==0)break;
if(lock>32700)break;
else lock++;
A dlay=new A();
dlay.delays(30000);//大家都累了休息分钟算了!^^

}//end while 
///下边是任务搞完了,善后工作
if(key==0){
System.out.println("很好,这几个SB最终完成了任务");
for(i=0;i<4;i++)
System.out.println("第"+(i+1)+"位失败了"+peoples[i].f[i]+"次");
}
else 
System.out.println("不是任务难,是SB没用!");

}//end main
}//end class

class people{
int event_rand[]=new int[10];
int state[]=new int[10];
int f[]=new int[4];
}
[解决办法]
好热,顶起来,哈哈!!
[解决办法]
帖子不错!顶上去!
[解决办法]
嗯。学习一下。。
[解决办法]
不要用线程 ,这样搭这个程序的框架
甲乙丙丁各自实现比如Human这个接口,然后在这个接口实现一个特定的方法,比如dowork(),然后在甲乙丙丁中有个doneNum之类的变量表示做完的事情,十件事,也就是1-10这10个值表示,没有做事,就是0

然后有个控制类Control,这个类里有甲乙丙丁这四个实现了接口的类,这个control类中有一个doWork()类似的方法,里面主要是循环10次
for(int i =0; i < 10; i++)
{
甲.dowork();
乙.dowork();
丙.dowork();
丁.dowork(); 
休息一分钟的方法();
}

对于扩展要求也好解决。
扩展要求1,每个类复杂自己的异常,报了异常就停止做事就好了,然后记录日志什么的
2.记录时间什么的可以让这个control类来做,当然最好是交给别的辅助类来做
[解决办法]
什么东西都跟算法有关系吗? 太扯了
[解决办法]
先顶贴,再看帖
[解决办法]
帮顶,接分
[解决办法]


是个问题
[解决办法]
帮顶,接分
[解决办法]
接分
[解决办法]
来学习一下,帮顶,接分
[解决办法]
应该用线程做!生产和消费!
学习!帮顶!
[解决办法]
不知道C#的事件和委托是不是线程做到的!可以学习那个思路!
[解决办法]
楼主有点幽默!
搞这行的幽默是件好事


[解决办法]
分配任务是在甲乙丙丁都休息了,同一时间内给甲乙丙丁都分配上任务,及启动4个线程!
还是甲做完了,再给乙分配任务,等乙的完成情况再给丙分配任务,最后等丁完成情况!这样的话好像就不用线程了!
从10开始倒序把任务压入栈中,失败的任务就在压入栈,任务分配从栈中取!做任务是做好记录!不知道可否!
[解决办法]
不懂,帮顶。。。
[解决办法]
恕我贱嘴下 

楼主初衷是好的 但我感觉楼主说话太揍做了 还有我很不喜欢说话用 呵. 太阴了 不知道诸位呢?

只是贱嘴下而已 没别的意思
[解决办法]
学习 8l 19l

[解决办法]
呵呵,楼主真有意思!
[解决办法]
我也在线等
[解决办法]
楼主能不能说说这个编程有什么用处吗?
[解决办法]
学习
[解决办法]
学到东西,谢谢!。。。。。。。。。
[解决办法]
四个人(甲乙丙丁)轮流做事情, 

这就不用线程了吧? 

[解决办法]
不觉得非要用多线程!


[解决办法]
看了下,其实大致思路是差不多的,这的确要涉及到算法,什么是算法,不知道没关系,看看书,或者自定义个概念也行的,反正我就自定义了个。我眼中的算法就是解决问题的方法、思路。好多的东西都可以数学化,那些戴眼镜的老家伙经常这样搞!这个问题争论还有一个焦点,那就是要不要线程,其实个人觉得,如果有人拿把刀架在我脖子上,说不能用线程,我想我能想出替代线程的办法,当然用线程那是一定可以解决问题的!
[解决办法]
跟个帖表示一下关切
[解决办法]
up
[解决办法]

探讨
什么东西都跟算法有关系吗? 太扯了

[解决办法]
class People
{
public:
People():m_pName(NULL),m_iDoThing(0){}
People(char* pName,int iDoThing = 10)
{
m_pName = new char[strlen(pName)+1];
strcpy(m_pName,pName);

m_iDoThing = iDoThing;
}

~People()
{
if (NULL != m_pName) 

delete [] m_pName;
m_pName = NULL;
}
m_iDoThing = 0;
}

bool DoWork()
{
if (1 > m_iDoThing) 
{
return true;
}

if (IsFailed()) 
{
// 打印错误日志,再写一个LOG类,写日志
return false;
}

--m_iDoThing;
return true;
}

bool IsFailed()
{
return true;
}


private:
char* m_pName;
int m_iDoThing;
};

后果循环调dowork 为真就清出循环,直到所有人被清掉为止,可以继续改善

[解决办法]
研究一下,先放在这里
[解决办法]

围观
[解决办法]
帮顶,接分
[解决办法]
學習,幫頂。
[解决办法]
学习一下,帮顶
------解决方案--------------------


接分
[解决办法]
不明白 目的是啥?

以为很难,进来后 有点失望
[解决办法]
学习了。
[解决办法]
接分再细看
[解决办法]
先顶再看
[解决办法]
这说话。。
[解决办法]
偶是菜鸟,进来瞧瞧,顶上面的,呵呵

[解决办法]
进来学习,楼主说说自己的算法,我们在学习学习吧!
[解决办法]
这个问题用ABCD启动四个线程是一种方案.

我想的另外一种方案是用三个线程来作.

主线程来处理ABCD的任务.一个线程来作数据的统计.一个线程做timer.


每个任务结束后将下次开始的时间queue进timer里,queue进timer的struct里应该包含timer,
以及这是谁的任务等信息.
.timer到时后会触发主线程来作某件事情.
如果生成错误主线成会queue struct到数据统计线程里去.
数据统计线程最保持错误数据的逻辑.


最后结束任务的时候的数据统计也是交给数据统计线程来作.
[解决办法]
说一下这里拒绝线程的理由
 1.多线程的逻辑没有单线程清晰
 2.多线程增加了写程序的复杂度
 3.无必要的多线程增加了开销
楼主的问题既然是轮流,那么就不会出现并发的可能,不出现并发的可能硬要用线程明显就是将问题复杂化,那么问题复杂化对于程序员来讲是大忌,是不好的习惯。所以我反对用多线程去解决没必要用多线程解决的问题
[解决办法]
不错,学习了
[解决办法]

探讨
引用:
这样可不可以
首先对你实践的精神表示肯定.
再则,你基本上是达到了要求的了,我为了说明方便,就说每人都做10件,其实每个人并非都是做10件事的,如:
甲要做7件事,乙要做8件事,丙要做9件事,丁要做10件,这样你的算法就需要改进的了,这样会出现有人先做完事的情况,比如甲先完成了,那剩余三人继续做,接着乙要做完了,那丙丁继续做....直到全部做完.这样就稍微麻烦点了,不过感觉好像也不大难,就是多几个判断了.(我还没试改进,先回复下吧)

[解决办法]
哎,学习

[解决办法]
接分
[解决办法]
进来看看
[解决办法]
探讨
这种些些小问题,楼主不是有些夸大吧?什么应聘之类的都扯上了,我虽然还没有毕业(不过都大四了),但是我看了下,找工作也不是那么容易的嘛!你这个问题其实没那么复杂,就是几个简单的语句在那里重用几下就行了,思路很简单的!我模拟了一个事件,假如是随机比较大小这样一件事!

import java.util.Random;
public class A{

public static void delays(int t){
int i=0;
for(i=0;i <t;i++);
//当然这里可以是线程的,由老板嘛!
}

public static void main(String args[]) {
int i,j,k=0;

Random rand = new Random();

people peoples[]=new people[4];//找到这样四个数据库
//下面这几句是给这 分配任务
for(i=0;i <4;i++){
peoples[i]=new people();
  for(j=0;j <10;j++){
      peoples[i].event_rand[j]=rand.nextInt(50)+30;
      peoples[i].state[j]=0; 
     
  }
  peoples[i].f[i]=0;
}
//现在是执行任务
int key=0,lock=0;

while(true){
    key=0;
    for(i=0;i <4;i++){
      for(j=0;j <10;j++){
        if(peoples[i].state[j]==0){
          key=1;
          //具体任务是随机单挑,遇到比其大的数,算任务失败
          if(peoples[i].event_rand[j] <rand.nextInt(80)){//这个SB本次任务执行不成功,给他记过一次
              peoples[i].f[i]++;
              //这里还可以记录更多的信息哦,比如具体件事
              continue;
          }else {


              peoples[i].state[j]=1;  // 这个SB本次任务执行成功  ,打个标记怕忘记了
              continue;
          }
        }
      }
   
    }//for1
    if(key==0)break;
    if(lock>32700)break;
    else lock++;
    A dlay=new A();
    dlay.delays(30000);//大家都累了休息分钟算了!^^
   
}//end while
///下边是任务搞完了,善后工作
  if(key==0){
      System.out.println("很好,这几个SB最终完成了任务");
      for(i=0;i <4;i++)   
      System.out.println("第"+(i+1)+"位失败了"+peoples[i].f[i]+"次");
  }
  else
  System.out.println("不是任务难,是SB没用!");

}//end main
}//end class

class people{
  int  event_rand[]=new int[10];
  int  state[]=new int[10];
  int  f[]=new int[4];
}


[解决办法]
问题一定要简单化
[解决办法]
学习下
[解决办法]
但是有时候难免都会先想到比较麻烦的做法!
[解决办法]
顶个 守望者 换头像了吗
[解决办法]
真不明白这的问题的初衷是干什么?
[解决办法]

[解决办法]
探讨
接分再细看

[解决办法]
学习!学习!
[解决办法]
看完悄悄的走
[解决办法]
8楼的
/////////////////
 甲doing No.1 
takes 5 mins 
success!!! 
----pause-----1min---- 
乙doing No.1 
takes 2 mins 
fail!! 
//////////////////
怎么知道甲花5分钟,乙花两分钟哦?
很希望帮忙回答下
[解决办法]
不知为什么,总没心思慢慢看,
老沉不下心来,我知道这是程序员不该犯得错误,
哎。。。
[解决办法]
天太热了 逛个论坛 凉快 凉快
[解决办法]
探讨
顶个 守望者 换头像了吗

[解决办法]
探讨
8楼的
/////////////////
甲doing No.1
takes 5 mins
success!!!
----pause-----1min----
乙doing No.1
takes 2 mins
fail!!
//////////////////
怎么知道甲花5分钟,乙花两分钟哦?
  很希望帮忙回答下

[解决办法]
/**
* @param args
* @throws InterruptedException 
*/
public static void main(String[] args) throws InterruptedException
{
String[] jobs = new String[40];//每人都要做十件事,四个人总共40件,就定义得40长度的数组吧
int a = 0,b = 0,c = 0,d = 0;//分别为每人正在做第几件事
int failA = 0,failB = 0,failC = 0,failD = 0;//记录每人做事失败的次数(统计用的)

for (int i = 0; i < jobs.length; i++)
{
if (i % 4 == 0)


{
try
{
System.out.println("甲正在做的第 " + (++a) + " 件事成功了!");

catch (Exception e)
{
System.out.println("甲正在做的第 " + (++a) + " 件事失败了!");
failA++;
}
}
else if (i % 4 == 1)
{
try
{
System.out.println("乙正在做的第 " + (++b) + " 件事成功了!");

catch (Exception e)
{
System.out.println("乙正在做的第 " + (++b) + " 件事失败了!");
failB++;
}
}
else if (i % 4 == 2)
{
try
{
System.out.println("丙正在做的第 " + (++c) + " 件事成功了!");

catch (Exception e)
{
System.out.println("丙正在做的第 " + (++c) + " 件事失败了!");
failC++;
}
}
else if (i % 4 == 3)
{
try
{
System.out.println("丁正在做的第 " + (++d) + " 件事成功了!");

catch (Exception e)
{
System.out.println("丁正在做的第 " + (++d) + " 件事失败了!");
failD++;
}

Thread.sleep(60000);//丁做完后,休息一分钟(我是用线程休眠来"休息"的)
}
}

System.out.println("甲做事成功率:"+ (a - failA) / (0.01 * a));
System.out.println("乙做事成功率:"+ (b - failB) / (0.01 * b));
System.out.println("丙做事成功率:"+ (c - failC) / (0.01 * c));
System.out.println("丁做事成功率:"+ (d - failD) / (0.01 * d));

}

我觉得这个想法很好,只是如果能够将判断是否成功的方法放在人做事的函数里就更好了
[解决办法]
受教了!
[解决办法]
学习!!

热点排行