不久前进行了一次算法考核,让我见识到了自己的渺小,双指针不会用。
先放只飞鸟缓一下:
目录
1.
思路:
一.判断最大和
二.起止位置
代码:
2.
思路:
今年暑假不AC:
代码如下:
再说此题:
代码如下:
1.
思路: 一.判断最大和
1.假设有1 2 3 4 5项。
首先,1项+2项,其次,判断 2项+3项 与 1项+2项 的关系,若大于,则子序列向后推进1,若小于,则跳过本次循环。之后一直往后判断,若之后的所有项相加都大于前几项之和(若前几项的和为正数,则大于0是必要条件),则最大的子序列是所有的项数相加之和(和要大于前一项)
解释:若1+2项>0,1+2+3项<1+2项,但1+2+3+4项>1+2项,但1+2+3+4+5项<1+2+3+4项,且从第2,3,4项开始的所有序列之和均<1+2+3+4项,则最大子序列为1+2+3+4项。
这个判断只需要一个for循环。
二.起止位置首先需要两个变量,分别用来存储开始,和结束的位置。
开始的位置是第一个,如果项数之和>0,则这个first的位置不变。
结束的位置随序列的增加而增加,若本次的循环跳过,则+2个位置
代码:#include2.int main() { int j,i,k,n,m,t; int a[100002]; scanf("%d",&t); for (j=1;j<=t;j++) { scanf("%d",&n); for (i=0;i d) //判断多加一项后的值与加之前的关系 { d=s; //令d==和的值。 f=m; //保存开始的位置 l=i+1; //保存结束的位置 } if (s<0) { s=0; 如果成立,只是和的值重新开始,但d,f,l已经事先存好了 m=i+2; //m的位置向后退两个 } } printf("Case %d:n%d %d %dn",j,d,f,l); if (j!=t) //满足只有两个样例之间空格 { printf("n"); } } return 0; }
思路:
在说这道题之前,有一个题与他类似。
如下:
今年暑假不AC:
1. 先按照结束时间进行排序,若相同,再按照开始时间进行排序。
2.依次比较前一个的结束时间与下一个的开始时间之间的关系。
代码如下:#include再说此题:struct zhuanbo //结构体来定义,因为要实现同时交换 { int a; int b; }zhuanbo[101]; int main() { struct zhuanbo t; int n,c=1; while(scanf("%d",&n)!=EOF && n!=0) { for(int i=0;i zhuanbo[j+1].b)//首先按照结束时间 { t=zhuanbo[j]; zhuanbo[j]=zhuanbo[j+1]; zhuanbo[j+1]=t; } if(zhuanbo[j].b==zhuanbo[j+1].b)//其次按照开始时间 { if(zhuanbo[j].a =t)//比较上一个的结束时间与下一个的开始时间 { c+=1; t=zhuanbo[i].b; } } printf("%dn",c); c=1; } return 0; }
1.首先比较保质期的长短。若保质期的时间相同,则比较利润数。
2.若保质期相同,则取利润最大的那一个,若保质期不相同,则直接取保质期短的那一个结构体里面的利润,(因为利润与保质期已经按顺序排好了)。如此进行比较。
代码如下:#includestruct stu { int a; int b; }stu[10001]; int main() { struct stu t; int n,c=0; while(scanf("%d",&n)!=EOF)//实现多组输入 { int a; for(int i=0;i =stu[j+1].a) { t=stu[j]; stu[j]=stu[j+1]; stu[j+1]=t; } } } } for(int i=n;i>=0;i--) { if(stu[i].b==stu[i+1].b) //当保质期相同时,取利润最大的那一个 { continue; }else{ c=c+stu[i].a; //保质期不相同,直接取上一个保质期对应的利润 } } printf("%dn",c); c=0; } return 0; }
这个题的思路就是这,但是如果直接使用冒泡排序进行运算的话,会超时,所以需要用快排,或者是直接调用排序函数(前提是保质期不相同)。
作为一个算法小白,我的分享就是这,如果有错误,欢迎指正。感谢观看!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)