今天听说是算法设计与分析上面的一道题目,很多题目自己扩展着多想一点还是很有意思的。
题目大意:有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都没写出来。被虐了!!