SF---漸進表達式,二分搜索算法,n個元素的所有不同排列,貪心法編程:汽車加油問題

 

 

 

 

遞歸算法的執行過程分兩個階段:_________________遞推和迴歸

 

 

問題的最優解包含其子問題的最優解是什麼性質_________最優子結構性質

 

 

將一個問題分成大小相等的k個子問題的處理方法是行之有效的,這是什麼思想________________________平衡(balancing)子問題思想

 

快速排序的運行時間與什麼有關____________劃分是否對稱

 

Strassen矩陣乘法中爲了降低時間複雜度,做出什麼改進_______減少乘法的次數

 

 

 

 

 

 

 

分治法編程:改寫二分搜索算法。

設a[0:n-1]是已排好序的數組,請改寫二分搜索算法,使得當x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜索元素在數組中時,i和j相同,均爲x在數組中的位置。

#include <stdio.h>
#include <stdlib.h>

int search(int a[],int length,int x)
{
 int i=0,j=0;
 int detection=-1;
 int top=length-1;
 int middle=0;
 int low=0;
 
 while(low<=top)
 {
 middle=(low+top)/2;
 if(a[middle]==x){
 detection=middle;
 }
 if(a[middle]<x)
 {
 low=middle+1;
 }
 else{
 top=middle-1;
 }
 
 }
 if(detection==-1)
 {
 i=top;
 j=low;
 }
 else{
 i=detection;
 j=i;
 }
 
 printf("i的值爲:%d\nj的值爲:%d\n",i,j);
 return 0;
}

int main()
{
 int h[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
 int length = sizeof(h) / sizeof(int);
 search(h,length,12);
 system("pause");
 
}

 

 

分治法編程:設集合R={r1,r2,...,rn}是要進行排列的n個元素,其中r1,r2,...,rn可能相同。 試着設計一個算法,列出R的所有不同排列。 即,給定n以及待排的n個可能重複的元素。計算輸出n個元素的所有不同排列。

寫出完整代碼,並給出測試用例和測試結果。

輸入樣例
        輸入:

aacc 
輸出:
aacc 
acac 
acca 
caac 
caca 
ccaa 
6

 

#include<stdio.h>
#include<string.h>
int count=0;
void swap(char &a,char &b)
{
 char temp;
 temp=a;
 a=b;
 b=temp;
}
int finish(char list[],int k,int i)
{//第i個元素是否在前面元素[k...i-1]中出現過
 if(i>k)
 {
 for(int j=k;j<i;j++)
 if(list[j]==list[i])
 return 0; 
 }
 return 1;
}
void perm(char list[],int k,int m)
{
 if(k==m)    //當只剩下一個元素時則輸出 
 {
 count++;
 for(int i=0;i<=m;i++)
 printf("%c",list[i]);
 putchar('\n');
 }
 for(int i=k;i<=m;i++)  //還有多個元素待排列,遞歸產生排列
 {
 if(finish(list,k,i))
 {
 swap(list[k],list[i]);
 perm(list,k+1,m);
 swap(list[k],list[i]);
 }
 } 
}
int main()
{
 int i,n;
 printf("請輸入元素個數:\n"); 
 scanf("%d",&n);
 printf("請輸入待排列的元素:\n");
 getchar();
 char *a=new char[n];
 for(i=0;i<n;i++)
 scanf("%c",&a[i]);
 printf("所有不同排列爲:\n");
 perm(a,0,n-1);
 printf("排列總數爲:%d\n",count);
 return 0;
} 

 

 

貪心法編程:汽車加油問題

一輛汽車加油滿後可行駛n千米。旅途中有k個加油站(不包含汽車的出發點)。假如在出發時已加滿油,請設計一個算法,使汽車在旅途中加油次數最少,並給出加油的地點。

寫出完整代碼、測試用例和測試結果。

 

#include<stdio.h>
#define M 100
int main(){
 int stations[M];//八個間距
 int ins; //油箱滿的時候可以走的距離
 int num;//中間加油站的數量
 int i;
 int all=0;//總的加油次數
 int lv;//油箱中的油量可以走的距離 
 
 
 printf("請輸入加油站的距離和數量\n");
 scanf("%d%d",&ins,&num);
 lv=ins;//油量賦初值
 
 printf("請輸入加油站間的距離\n");
 for(i=0;i<num+1;i++){
  scanf("%d",&stations[i]);
 }
 
 printf("加油站間的距離分別爲:\n");
 for(i=0;i<num+1;i++){
  printf("%d  ",stations[i]);
 }
 puts("");
 
 
 for(i=0;i<num+1;i++){//如果油量可以支撐下一段路,則繼續走
 
 if(stations[i]>ins) {
 printf("汽車不可能達到終點站");
 return 0;
 }
 
 if(lv>=stations[i]){
 lv-=stations[i];
 }
 
 else {  //否則加滿油
 lv=ins-stations[i];
 all++;
 printf("汽車在第%d站加了油\n",i);
 }
 }
 
 printf("需要加油的總的加油站數量\n");
 printf("%d\n",all);//輸出總的加油次數
}

 

大學算法分析與設計複習總結::

https://blog.csdn.net/wwj_748/article/details/9040635 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章