元旦“欢乐”测试反思

元旦前夕,来了个“欢乐”测试,真的好欢乐啊~~抓狂

让我一一分析一下;

第一题:

调用第二行的信息智商高于数学智商,要求问最多能把几个学信息学的学生调去学数学,而两个竞赛的学生平均IQ都有提升呢?

cin                           cout

 

3                              1

3 2 3

3

3 2 5

测试点实在太诱人了,搞得我想的实在是太简单,本蒟蒻的代码如下:

#include<bits/stdc++.h>                                             
using namespace std;                                             



int m,n,k,j,g,d;
int a[120]={0},b[120]={0};
void work()
{
k=0;
for(int i=m;i>=1;i--)
 {
//   cout<<g<<b[i];
   if(g<b[i])
 k++;
 }
}
int main()
{
cin>>n;g=0;
for(int i=1;i<=n;i++)
 {
   cin>>a[i];
   if(a[i]>g)
     g=a[i];
      }
//sort(a,a+n+1);
    cin>>m;
    for(int i=1;i<=m;i++)
      cin>>b[i];
    //sort(b,b+m+1);
    work();
    cout<<k;
    return 0;
}

(20分抓狂)~~

本因代码如下:

 

#include<bits/stdc++.h>

using namespace std

long long n,m,num=0,maxa=0,maxb=0,e=0;

 

<span style="color:#ff0000"><code><span style="color:#0000ff">int</span> a[<span style="color:#a900a9">101</span>]={},b[<span style="color:#a900a9">101</span>]={};
<span style="color:#0000ff">int</span> <strong>main</strong>()
{
 	cin>>n;
 	<strong>for</strong>(<span style="color:#0000ff">int</span> i=<span style="color:#a900a9">1</span>;i<=n;i++)
 	{
 		cin>>a[i];
 		maxa+=a[i];
 	}
    cin>>m;
    <strong>for</strong>(<span style="color:#0000ff">int</span> i=<span style="color:#a900a9">1</span>;i<=m;i++)
    {
    	cin>>b[i];
    	maxb+=b[i];
    }        
    <span style="color:#0000ff">int</span> x=n,y=m;
    <strong>sort</strong>(a<span style="color:#a900a9">+1</span>,a<span style="color:#a900a9">+1</span>+n);
    <strong>sort</strong>(b<span style="color:#a900a9">+1</span>,b<span style="color:#a900a9">+1</span>+m);
    <span style="color:#0000ff">double</span> IQA=maxa*<span style="color:#a900a9">1.0</span>/x,IQB=maxb*<span style="color:#a900a9">1.0</span>/y;
    <strong>for</strong>(<span style="color:#0000ff">int</span> i=<span style="color:#a900a9">1</span>;i<=m;i++)
    {
    	<strong>if</strong>(b[i]>IQA && b[i]<IQB)
    	{
    		num++;x++;y--;
    		maxa+=b[i];
    		maxb-=b[i];
    		IQA=maxa*<span style="color:#a900a9">1.0</span>/(x*<span style="color:#a900a9">1.0</span>);
    		IQB=maxb*<span style="color:#a900a9">1.0</span>/(y*<span style="color:#a900a9">1.0</span>);
    	}
    }
    cout<<num;
	<strong>return</strong> <span style="color:#a900a9">0</span>;
}(不是我打的<img alt="吐舌头" data-cke-saved-src="http://static.blog.youkuaiyun.com/xheditor/xheditor_emot/default/tongue.gif" src="http://static.blog.youkuaiyun.com/xheditor/xheditor_emot/default/tongue.gif" />)</code></span>
<span style="color:#ff0000"><code>
</code></span>
<span style="color:#999999">NO.two</span>
<span style="color:#999999">工序问题</span>

 

某工厂收到了n个产品的订单,这n个产品分别在A、B两个车间加工,并且必须先在A车间加工后才可以到B车间加工。

某个产品i在A、B两车间加工的时

cin                                 cout
5                                      34
3 5 8 7 10
6 2 1 4 9              

现代码:

<span style="color:#cc0000">#include<bits/stdc++.h>
using namespace std;
int n,m,k,i,j;
int a[1005]={0},b[1005]={0};
int main()
{
	cin>>n;
	for(i=1;i<=n;i++)
	  cin>>a[i];
	for(i=1;i<=n;i++)
	  cin>>b[i];
	k=0;
    for(i=1;i<=n;i++)
      {
      	if(a[i]>b[i-1])
      	   k=k+a[i];
      	else
      	  k=k+b[i-1];
      }
    cout<<k;
    return 0;
}(错误代码<img alt="吐舌头" data-cke-saved-src="http://static.blog.youkuaiyun.com/xheditor/xheditor_emot/default/tongue.gif" src="http://static.blog.youkuaiyun.com/xheditor/xheditor_emot/default/tongue.gif" />)
</span>
<span style="color:#cc0000">思路应为:</span>
<span style="color:#333333">n个作业要在由两台机器M1和M2组成的流水线上完成加工.每个作业i必须先在M1上然后在M2上加工,时间分别为ai和bi。</span>
<span style="color:#333333">确定这n个作业的加工顺序,使得从第一个任务开始在M1上加工到最后一个任务在M2上加工完成的总时间尽量小。</span>

 

直观上,最优调度一定让M1没有空闲,M2的空闲时间尽量少。

算法:①使用数组f1[j] 存放a[i]<b[i]的作业;

②使用数组f2[k] 存放a[i]>=b[i]的作业;

③对f1[j]根据a[j]进行升序排列;

④对f2[k]根据b[k]进行降序排列;

⑤遍历两个数组,依次求时间:取两个机器运行时间的较大值作为作业用时。

程序易于实现,时间O(nlogn),关键在于正确性证明。

<span style="color:#cc0000">
</span>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值