第一题:kolakoski序列
源码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
vector<int> a(m,0);
cin >> n >> m;
for(int i=0;i<m;i++)
cin >> a[i];
vector<int> kolakoski;
int cou=-1;
for(int i=0;i<a[0];i++)
{
kolakoski.push_back(a[0]);
}
//每一个小数组的长度组成的数组与原数组相同
for(int i=1;cou<n;i++)
{
int len=kolakoski[i];
int num=i%m;
int ele=a[num];
for(int j=0;j<len;j++)
kolakoski.push_back(ele);
int si=kolakoski.size();
if(si>=n)
break;
}
for(int i=0;i<n;i++)
cout << kolakoski[i] << endl;
}
第二题:装包裹问题
源码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num[6];
int res;
while(1)
{
res=0;
bool isbreak=1;
for(int i=0;i<6;i++)
{
cin >> num[i];
if(isbreak && num[i])
isbreak=0;
}
if(isbreak)
break;
//放置6*6的包裹
res+=num[5];
//放置5*5的包裹,填充1*1的
res+=num[4];
int shengyu1=num[4]*11;
//放置4*4的包裹,填充2*2,1*1的
res+=num[3];
int shengyu2=5*num[3];
//放置3*3的包裹,填充2*2,1*1的
res+=num[2]/4;
num[2]%=4;
if(num[2]==1)
{
res++;
shengyu2+=5;
shengyu1+=7;
}
else if(num[2]==2)
{
res++;
shengyu2+=3;
shengyu1+=6;
}
else if(num[2]==3)
{
res++;
shengyu2+=1;
shengyu1+=5;
}
//放置2*2的包裹,填充1*1的
if(num[1]<=shengyu2) //2*2的全部被填充
{
shengyu2-=num[1];
num[1]=0;
shengyu1 = shengyu1+4*shengyu2;
shengyu2=0;
}
else
{
num[1]-=shengyu2;
shengyu2=0;
res+=num[1]/18;
num[1]%=18;
if(num[1]) res++;
shengyu1 = 36-num[1]*4;
}
//放置1*1的包裹
if(num[0]<=shengyu1) //1*1的全部被填充
{
shengyu1-=num[0];
num[0]=0;
}
else
{
num[0]-=shengyu1;
shengyu1=0;
res+=num[0]/36;
num[0]%=36;
if(num[0]) res++;
}
cout << res << endl;
}
}
第二题的代码可以从以下几点再进行优化,以上面这种方式写结构清楚:
1.res=res+num[5]+num[4]+num[3]+(num[2]+3)/4;//加3是为了向上取整
2.shengyu2=num[3]*5+7-2*(num[2]%4?7:num[2]%4);
3.shengyu1=num[4]*11+7-(num[2]%4?7:num[2]%4)+4*shengyu2;
欢迎大家批评指正!