贪心其实说起来很简单,就是找到一个最好的方法,然后不断的循环
比如我要取一个数列中和最大的十个数,那方法当然是不断的取最大的那个数
说起来非常简单
但是
但是
但是
实际上贪心的算法非常难想,可能是我上学期递归没学好...?
反正我一道题写好久,写到现在才写了两道题,而且其实还是看过题解的
D crossing river
n个人要过河,一条船能坐两个人而且一定要有一个人划船。每个人都有一个各自的过河时间,两个人的过河时间取决于慢的那一个。要求最短的过河时间。
本来很简单的想,应该就是过河时间最短的那一个带着大家过河吧。
WA了好多次去看题解,发现还应该和另一种过法比较
时间最短的两个人先过河,最短的那个回来,最长的两个过去,次短的回来。
写了条式子比较发现还真的是要依情况而定的。
原来这两种过河的方法我是割裂开来算的,然后第二种方法我就不知道要怎么用代码实现了,觉得要考虑的情况还好多。
实际上只用每次循环就好
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
int t,peo[1005];
scanf("%d",&t);
while (t--)
{
int n,i;
int time1=0,time2=0,time =0;
int flag=1,p[1005]={0},cnt=0;
printf("
");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&peo[i]);
}
sort(peo,peo+n);
while(1)
{
if(n==1)
{
time+= peo[0];
break;
}
else if(n==2)
{
time+= peo[1];
break;
}
else if(n==3)
{
time+=peo[0]+peo[1]+peo[2];
break;
}
else
{
if(2*peo[1]>(peo[0]+peo[n-2]))
{
time +=2*peo[0]+peo[n-1]+peo[n-2];
n-=2;
}
else
{
time+=2*peo[1]+peo[0]+peo[n-1];
n-=2;
}
}
}
printf("%d
",time);
}
}
I doing homework
有好多作业,一天可以做一个作业然后要在deadline之前完成,完成不了就要扣除相应的学分。要求扣除最少的学分
先设置了一个结构体,存作业的deadline和score
然后按deadline从小到大排序,找到学分最大的那个的位置i。用day记当前的时间,
i到前一个节点就是这段时间要做的作业数,i的deadline减day就是这段时间可以做的作业数
减一下就是必须要扣掉的作业数,这时候记下最小的那几个的学分就可以了。
但是又不知道为什么WA了好多次
就去找滔滔,讲自己的想法的时候自己都觉得自己的方法好麻烦哦
说着说着就能发现自己一些想法上的漏洞
以后可能写程序的时候就可以模拟要给别人讲解自己这段程序的意思,可能就可以弥补一些漏洞了。所以好好写注释吧
然后又去看了题解。
把学分从大到小排,因为学分大的当然要优先完成它,但是又不能完成的太早,最好就是在deadline的那一天完成。
用一个数组来记录这一天有没有安排作业了,1表示已经有作业安排了,0表示没有。
按学分从大到小,每一个都看能不能在它的deadline之前完成作业,并且这个循环要从大到小来做
如果不能的话就记下学分
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct hw{
int dead;
int score;
};
bool cmp(hw a,hw b)
{
if (a.score != b.score)
return a.score > b.score;
else return a.dead < b.dead;
}
int main()
{
int t;
struct hw a[1005];
scanf("%d",&t);
while (t--)
{
int i,n,v[1005];
scanf("%d",&n);
for(i=0;i<n;i++)
{
v[i]=0;
scanf("%d",&a[i].dead);
}
for(i=0;i<n;i++)
{
scanf("%d",&a[i].score);
}
sort(a,a+n,cmp);
int ans=0;
for(i=0;i<n;i++)
{
int j=a[i].dead-1;
for(;j>=0;j--)
{
if(!v[j])
{
v[j]=1;
break;
}
}
if(j==-1)
{
ans+=a[i].score;
}
}
printf("%d
",ans);
}
return 0;
}