一个题目和参加校园招聘会的题目

 今天听说是算法设计与分析上面的一道题目,很多题目自己扩展着多想一点还是很有意思的。


     题目大意:有3n个花盆,红色,蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄,红,蓝,黄,蓝,红。

     请编写一程序:将各花盆按红,黄,蓝,红,黄,蓝。。。的顺序排列,而且要求花盆之间的交换次数最少。

     题目应该只是把最终情况输出,然后求个最小步数。开始理解的是只有相邻的花盆才可以交换,不过好像都可以交换的。先分析下,如果改放红色的放了蓝色,而放了蓝色的也放了红色,这样的个数可以直接相抵消,然后步数+1。如果最后还有不能抵消的,a[1][2]统计的是该放1而放了2的花盆数目,a[1][2]=4,a[2][1]=0,因为开始已经相消了一次了。a[2][3]肯定不为0,因为2没有占到自己的位置,并且a[2][3]必须等于4,同理a[3][1]也必须等于4,这样交换的次数再加上4*2即可。自己是这样想的。也不知道具体对不对。附上代码。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
int a[4][4];

map <string,int> mq;

int main()
{
    string s[3]={"红","黄","蓝"};
    mq[s[0]]=1; mq[s[1]]=2; mq[s[2]]=3;
    int n;
    int i,j;
    while(scanf("%d",&n)&&n)
    {
        char t[4];
        int res=0;
        memset(a,0,sizeof(a));
        for(i=0;i<n;i++)
        {
            for(j=1;j<=3;j++)
            {
                scanf("%s",t);
                a[j][mq[t]]++;
            }
        }

        int tmp;
        for(i=1;i<=2;i++)
            for(j=i+1;j<=3;j++)
            {
                tmp=min(a[i][j],a[j][i]);   //先可以直接交换的先直接交换
                a[i][j]-=tmp,a[j][i]-=tmp;
                res+=tmp;
            }

        if(a[1][2]) res+=a[1][2]*2;   //三个互换位置的
        else if(a[2][1]) res+=a[2][1]*2;

        cout<<s[0];
        for(i=1;i<n*3;i++)
           cout<<" "<<s[i%3];
        printf("\n%d\n",res);
    }
    return 0;
}

/*
1
红 黄 蓝
1
蓝 红 黄
2
蓝 红 黄 红 蓝 黄
2
蓝 黄 红 蓝 黄 红
*/


另外是今天参加mysoft的招聘会,做了研发的笔试题目,表示去面试还是需要积累很多经验的,有个题目是考物理压强之类的TAT,这个可以直接忽略掉,有一个选择是这样出的,一个人去寄信这段距离需要消耗掉200kg的粮食,每次这个人只能负重120kg的粮食,问这个人把信寄出去需要负重多少?题目也没加任何注释,当时就不懂了,于是果断写上了400kg一去一来的粮食。。后来问他们才知道是先负重120kg然后丢40kg的粮食放在1/5那段地方,一去一来消耗

80kg,这样不断来来往往,把信寄出去。。原来还可以储存粮食。




然后考了一个大数类的加法,不过照题目的意思,应该是转化成string直接相加,开始还准备用java大数类或者int数组每一位存8位这样写,直接用string相加。在写fibo的时候经常用到。附上代码:

string add(string s1,string s2)  
{  
      
    int j,l,la,lb;  
    string max,min;  
    max=s1;min=s2;  
    if(s1.length()<s2.length())
        {max=s2;min=s1;}  
    la=max.size();lb=min.size();  
    l=la-1;  
    for(j=lb-1;j>=0;j--,l--) 
        max[l] += min[j]-'0';   
    for(j=la-1;j>=1;j--) 
        if(max[j]>'9')
            {max[j]-=10;max[j-1]++;}  
    if(max[0]>'9') 
        {max[0]-=10;max='1'+max;}  
    return max;  
}  




后面有一个实际问题,两个相邻200m的交通灯,红灯有限制时间,绿灯也有限制时间,自己可以获取车流量与速度相关信息,建模写代码,使得车的通行量最大。当时就懵了,就瞎写写了。后面的题目问了些C#,html的问题表示什么都不会。写一个继承语句implement都没写出来。被虐了!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值