求一个优秀算法,参与有分.
基本需求如下:
1.有四个人(甲乙丙丁)轮流做事情,按甲乙丙丁顺序,每人各有10件事情要做,但每人每次只允许做一件,并且从第一件开始做.
2.等到丁做完一件事后,休息1分钟,然后又从甲开始做剩下的事情,以此循环,直到四人都做完自己的所有事情.
以上为基本要求,附加扩展需求如下:
1.如果一件事做失败了,则记录它的做事者,以及失败原因,失败时间等,再输入到c:/note.txt,然后再跳过该件事,其它人继续进行.
2.当四人完成所有事情后,记录每人完成事情的所需的总时间以及成功率(或失败率),最好能用图表显示统计.
我想方法可能不少,但效率可能有别,此算法看似简单,但要运用的知识点却不少,线程,异常处理,循环应用,文件操作等等,
对一般人练练手应该还是有意义的啦.
大家有兴趣也来露两手如何?附加要求可以不考虑.本人的就不贴上去献丑了,呵
最后说下,本人认为该需求用于面试也不错,如果有人能在30分钟内完成,水平应该是相当不错的(使用时间越少,正确率越高,相对来说被面试者水平越高)
当然如果你认为是这是作业题或太简单了而不屑一顾的话,那你可以绕路了(此处已难以展现你才能了,人各有志吧,水平不同当然目标不同了,可以理解的,呵.)
[解决办法]
有四个人(甲乙丙丁)轮流做事情,
这就不用线程了吧?
[解决办法]
我完全不觉得这个跟线程有什么关系。。
[解决办法]
4个人。。
同意楼上用线程!!
[解决办法]
这样可不可以
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
[解决办法]
{
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));
}
我觉得这个想法很好,只是如果能够将判断是否成功的方法放在人做事的函数里就更好了
[解决办法]
受教了!
[解决办法]
学习!!