Y
题意:给出工厂每天加工每个奶酪需要的价格,以及每天的需求量,奶酪可以存放在仓库里,给出每个奶酪存放一天需要的价格,问,这些生产任务全部完成,最少的花费多少
这道题题干看了好久我才看懂,不过思路比较明确,每天的奶酪的花费要么是前一天提前做加放在仓库里的价格,要么是当天做的价格,想的比较简单,后来和同学讨论了一下,举了几个例子,发现每天的奶酪花费也不一定是前一天做,可能提前好几天做,而放在仓库里的花费非常小,这样也有可能让花费最少,于是就写了两个代码,结果两个都通过了,想了好久也没有想明白第一个思路为什么能过题,后来觉得应该是每一步都取了最优,所以最后结果是最优(欢迎指正),下面把两个代码都放在这里
#include<iostream>
using namespace std;
struct n
{
int c,f;
} a[10005];
int main()
{
long long int n,s,i,sum=0;
cin>>n>>s;
for(i=0; i<n; i++)
cin>>a[i].c>>a[i].f;
sum=a[0].c*a[0].f;
for(i=1; i<n; i++)
{
if(a[i].c*a[i].f>(a[i-1].c+s)*a[i].f)
{
sum+=(a[i-1].c+s)*a[i].f;
}
else sum+=a[i].c*a[i].f;
}
cout<<sum<<endl;
return 0;
}
#include<iostream>
using namespace std;
struct n
{
int c,f;
} a[10005];
int main()
{
long long int n,s,i,sum=0,m;
cin>>n>>s;
for(i=0; i<n; i++)
cin>>a[i].c>>a[i].f;
sum=a[0].c*a[0].f;
m=a[0].c;
for(i=1; i<n; i++)
{
if(a[i].c*a[i].f>(m+s)*a[i].f)
{
sum+=(a[i-1].c+s)*a[i].f;
m=m+s;
}
else {
sum+=a[i].c*a[i].f;
m=a[i].c;
}
}
cout<<sum<<endl;
return 0;
}
M
题意:用6 * 6的箱子装给定数量的1 * 1,2 * 2,3 * 3,4 * 4 ,5 * 5,6 * 6的箱子,计算最少需要用多少个6*6的箱子才可以将所有的箱子都装进去。
典型的找规律题,如果装满一整箱有一下几种方式
一个66
一个55 11个11
一个44 5个22
一个33 5个22 7个33
两个33 3个22 6个11
三个33 1个22 5个11
九个22
36个11
然后我就每个方式都分析了一遍,从6*6开始,每次都按1和2的空缺情况把1 * 1和2 * 2相应减去,但是因为没有考虑每种方式可能出现2减为0,需要把剩余的空缺2转1的情况,结果错了,如果再对每一种情况的增加分析,虽然能做但代码太长,于是就换了一种处理方式,先把每次1和2的空缺情况个数记录下来,最后依次比较2和1,这样写就稍微简单一点。
以下是错解和正解,可对比分析
正解:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a[7];
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
{
if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
break;
int sum=0,y=0,r=0;
sum=a[6]+a[5]+a[4]+ceil(double(a[3]*1.0/4));
y+=11*a[5];
r+=5*a[4];
if(a[3]%4==1)
{
y+=7;
r+=5;
}
else if(a[3]%4==2)
{
y+=6;
r+=3;
}
else if(a[3]%4==3)
{
y+=5;
r+=1;
}
if(a[2]>r)
{
sum++;
a[2]-=r;
while(a[2]>9)
{
sum++;
a[2]-=9;
}
y+=36-4*a[2];
}
else y+=(r-a[2])*4;
if(a[1]>y)
{
a[1]-=y;
sum+=ceil(double(a[1]*1.0/36));
}
cout<<sum<<endl;
}
return 0;
}
错解
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a[7];
while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
{
if(a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0&&a[6]==0)
break;
int sum=0,y=0,r=0;
sum=a[6]+a[5]+a[4]+ceil(double(a[3]*1.0/4));
y+=11*a[5];
r+=5*a[4];
if(a[3]%4==1)
{
y+=7;
r+=5;
}
else if(a[3]%4==2)
{
y+=6;
r+=3;
}
else if(a[3]%4==3)
{
y+=5;
r+=1;
}
if(a[2]>r)
{
sum++;
a[2]-=r;
while(a[2]>9)
{
sum++;
a[2]-=9;
}
y+=36-4*a[2];
}
else y+=(r-a[2])*4;
if(a[1]>y)
{
sum++;
a[1]-=y;
sum+=ceil(double(a[1]*1.0/36));
}
cout<<sum<<endl;
}
return 0;
}