今天终于把贪心的作业写完了,一下午加一个晚上,终于搞定了两道题,真的是太耻辱了。
第一题是猫粮和java币的问题,每个房子里有不同数量的java币,每个房子价值的猫粮也是不一样的,我们要尽可能用最少的猫粮换最多的java币,所以就要关注他们的性价比问题
这里用到的贪心就是把性价比排序,选择最高性价比的房子进行交换。
代码
#include <iostream>
#include<algorithm>
#include <cstdio>
using namespace std;
struct dd
{
int f;//猫粮
int j;//java币
double v;//性价比
} home[1000];
bool cmp(const dd& a,const dd& b)
{
return a.v>b.v;
}
int main()
{
int m,n;
while(scanf("%d %d",&m,&n)!=EOF)
{
double ans=0;
if(m==-1&&n==-1)
break;
else
{
int i;
for(i=0; i<n; i++)
{
scanf("%d %d",&home[i].j,&home[i].f);
home[i].v=(home[i].j*1.0)/(home[i].f*1.0);
}
sort(home,home+n,cmp);
int flag=m;
for(i=0; i<n; i++)
{
if(flag>=home[i].f)
{
flag-=home[i].f;
ans+=home[i].j;
}
else
{
ans+=(double)flag*home[i].j/home[i].f;
flag=0;
}
if(flag==0)
break;
}
}
printf("%.3f\n",ans);
ans=0;
}
return 0;
}
第二题是今年暑假不ac,这道题我用的是把每个电视节目的结束时间排序,尽量选择结束时间短的看,但是也有用开始时间排序的,但是我现在还想不出来。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct dd
{
int shart;
int endd;
} home[105];
bool cmp(dd a,dd b)
{
if(a.endd==b.endd)
return a.shart>b.shart;
return a.endd<b.endd;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=0; i<n; i++)
{
scanf("%d%d",&home[i].shart,&home[i].endd);
}
sort(home,home+n,cmp);
int j=home[0].endd;
int ans=1;
for(i=1; i<n; i++)
{
if(home[i].shart>=j)
{
ans++;
j=home[i].endd;
}
}
printf("%d\n",ans);
}
return 0;
}
第三题是我今天一直都在卡壳的题,会场安排,最开始也是用的结束时间排的序,每一个活动有一个标记,如果它被安排上了,flag==1,没有就是0,这样的话每一次都要从flag=0的时候开始,要使用很多次循环,可能是算法本身也有问题,A不了。
后来用了开始的时间排序,去找开始时间少的,用一次循环,从最开始看它可不可以被安排,不被安排就单独给它加一个,下一个就看可不可以安排到第一个和第二个,如果都不行再给他单独开一个。。。
一次代码(w)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct dd
{
int shart;
int endd;
int flag;
} home[10050];
bool cmp(dd a,dd b)
{
if(a.endd==b.endd)
return a.shart<b.shart;
return a.endd<b.endd;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d%d",&home[i].shart,&home[i].endd);
home[i].flag=0;
}
sort(home,home+n,cmp);
int con=0;
int ans=0;
while(con<n)
{
int j=0;
for(i=0;i<n;i++)
{
if(home[i].shart>=j&&home[i].flag==0)
{
// printf("oooooo\n");
home[i].flag=1;
j=home[i].endd;
con++;
}
}
ans++;
//printf("iiiiioh");
}
printf("%d\n",ans);
return 0;
}
//这一道题是从网上看的,可能是思路问题,本身找不到错误就是A不了。网上的代码同样不可以。
二次代码(A)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct dd
{
int shart;
int endd;
} home[10050];
bool cmp(dd a,dd b)
{
if(a.shart==b.shart)
return a.endd<b.endd;
return a.shart<b.shart;
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d%d",&home[i].shart,&home[i].endd);
}
sort(home,home+n,cmp);
int j[10050];
j[1]=home[0].endd;
int ans=1;
int k;
for(i=1; i<n; i++)
{
for( k=1; k<=ans; k++)
if(home[i].shart>=j[k])
{
j[k]=home[i].endd;
break;
}
if(k==ans+1)
j[++ans]=home[i].endd;
}
printf("%d\n",ans);
return 0;
}
第三个题也让我明白了算法的变通,因为老师在讲课的时候说了这个会场安排问题要用,结束的时间排序,我就一昧的用这个方法,就一直也成功不了,后来才知道是本身的想法不对。
现在也很少有人可以看到这里啦。
大二是一个很神奇的时间段,我活得异常清醒,看见了大一的懵懂,对于初学计算机的困难。就像看去年的我。我也看到了大四的师哥,为了以后的发展奔走,就像看见了以后的我,回忆起从来到这个地方到现在,放松自己给我带来的后果越来越难以承担,不好的习惯,越来越大的差距,我深深的感受到了,却难以改变。我总是记得原来老师说过的一句话,你漏掉的知识,老天总会在一个特定的时间段让你弥补回来,我相信我的这个时间点快要到了。
当助导的前前后后一个月,真的让我清醒了很多,看见了原来看不见的东西,也可能是现在身边的人都开始努力了把,这也是我在这个时间整理这篇文章,打这段字的原因把,我要坚持住这一段热情,别去收回,别去堕落。
2018.10.17 夜