国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

過去一周寫過的算法題的一部分(dfs,貪心)

這篇具有很好參考價值的文章主要介紹了過去一周寫過的算法題的一部分(dfs,貪心)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

(首先說明一點哈:這是我第一次寫博客,寫的不好大家見諒)

自我介紹:一個腦子不好的大一學生,c語言接觸還沒到半年,若涉及到效率等問題,各位都可以在評論區(qū)提出見解,謝謝啦

1.dfs題:奇怪的電梯

(題目鏈接:P1135 奇怪的電梯 - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

我一開始用的是比較常見類似與組合的那種回溯格式,雖然答案正確,可是第二組數(shù)據(jù)就超時了,以下為較為簡潔的AC代碼;

#include<stdio.h>
#include<math.h>
#include<string.h>
int n, a, b, book[250] = { 0 }, lou[250] = { 0 };
//book數(shù)組:標記到達每樓時需要多少步,lou數(shù)組:記錄每樓可以上下多少樓
void dfs(int step,int count)
{//step表示現(xiàn)在所在樓層
    if ( step > n || step < 1)return;//判斷樓層是否合格,放開頭
    if (book[step] != -1 &&/**/count >= book[step])return;//注意是與不是或;注意答案要求為最少步數(shù),因此大于的要return;

    book[step] = count;
    dfs(step +lou[step], count + 1);//上樓
    dfs(step - lou[step], count + 1);//下樓

}
int main()
 {
    scanf("%d%d%d", &n, &a, &b);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &lou[i]);
    }
    memset(book,-1,sizeof(book));//將數(shù)組內(nèi)所有元素賦值為-1
    dfs(a, 0);
    printf("%d\n",book[b]);
    return 0;
}

2.dfs題:n皇后

(題目鏈接:https://www.luogu.com.cn/problem/P1219)

要對行和列對角線和反對角線進行查找,但該題并不要用到二維數(shù)組,用一維數(shù)組就好,把行當作遞歸函數(shù)的形參就好

#include<stdio.h>
#include<math.h>
#include<string.h>
int n, count = 0, a[15] = { 0 }, lie[30] = { 0 }, dui[30] = { 0 }, fandui[30] = { 0 };
//a數(shù)組來記錄皇后在每一行的位置,其他數(shù)組為標記是否可放皇后
void dfs(int row)
{
	if (row == n + 1)//+1原因:第一步行和列都是從1開始的
	{
		count++;
		if (count <= 3)//打印前三項
		{
			for (int j = 1; j <= n; j++)printf("%d ", a[j]);
			printf("\n");
		}
		return;//返回   上一層   !
	}
	for (int j = 1; j <= n; j++)
	{
		a[row] = j;//記錄第row行皇后在j的位置
		if (lie[j] || dui[row + j] || fandui[row- j + n])
			continue;
		//判斷列和對角線和反對角線//對角線上:行加列相等,反對角線上i-j相等,但為了避免[]里為負數(shù),因此都加上了n
		lie[j] = dui[row + j] = fandui[row - j + n] = 1;
		//標記該列和對角線,反對角線
		dfs(row + 1);
		//進入下一行
		lie[j] = dui[row + j] = fandui[row - j + n] = 0;
		//回溯
	}
}
int main()
{
	scanf("%d", &n);
	dfs(1);
	printf("%d\n", count);//注意是在主函數(shù)才打印總數(shù)
	return 0;
}

3.dfs題:海戰(zhàn)

(題目鏈接:P1331 海戰(zhàn) - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

代碼看起來很長,但都是簡單函數(shù)構(gòu)成

#include<stdio.h>
#include<math.h>
#include<string.h>
int r, c, count = 0, dx[4] = { 0,0,-1,1 }, dy[4] = { -1,1,0,0 }, book[1010][1010] = { 0 };
//book數(shù)組:標記哪些點已計數(shù)過,避免重復計數(shù)
char a[1010][1010] = { 0 };
int judge(int x, int y)
{
	if (x > r|| x<0||y<0|| y > c)
		return 0;
	return 1;
}
void dfs(int x, int y)
{
	book[x][y] = 1;		
	if (judge(x, y) == 1)
	{
		for (int i = 0; i < 4; i++)
		{
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (a[nx][ny] == '#' && book[nx][ny] == 0 && judge(nx,ny) == 1)
				/*!!!!!!!!注意一定要寫條件才能遞歸,不然一直遞歸!!!!!!*/
				dfs(nx, ny);
			//book[nx][ny] = 0;
			/***不可將book還原,因為可能在主函數(shù)的循環(huán)部分重復計數(shù)***/
		}
	}
}
int check(int x,int y)//check函數(shù):判斷相撞
{		
		int sum = 0;
		    if (a[x][y] == '#')
			sum++;
			if (a[x + 1][y] == '#')
				sum++;
			if (a[x][y + 1] == '#')
				sum++;
			if (a[x + 1][y + 1] == '#')
				sum++;
			if (sum == 3)//這里很巧妙
				return 0;
			return 1;
}
int main()
{
	int i, j;
	scanf("%d%d", &r, &c);
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			scanf(" %c", &a[i][j]);
		}
	}
	for (i = 0; i < r; i++)
	{
		for (j = 0; j < c; j++)
		{
			if(check(i, j) == 0)
			{
				printf("Bad placement.\n");
				return 0;
				//不用跳出循環(huán),直接return
			}
			else
			{
				if(a[i][j]=='#'&&book[i][j]==0)
				{
					dfs(i, j);
					count++;//注意是在這里加加
				}
			}
		}
	}
	printf("There are %d ships.\n",count);
	return 0;
}

4.dfs題:迷宮尋路

(題目鏈接:B3625 迷宮尋路 - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

以下為自己所寫代碼,可AC

#include<stdio.h>
#include<math.h>
#include<string.h>
int n, m, book[110][110] = { 0 };//book數(shù)組:記錄哪些地方走過了
char a[110][110] = { 0 };
int dfs(int e, int f)
{
	if (book[e][f] == 1)return 0;//注意在開頭判斷
	book[e][f] = 1;//標記該點已走過
	if (e > n || e <= 0 || f<=0 || f>m)//判斷越界
        return 0;
	if (a[e][f] == '#')//遇見墻就返回
		return 0;
	if (e == n && f == m)
	{
		return 1;
	}
	if ((dfs(e + 1, f) == 1) || (dfs(e, f + 1) == 1) || (dfs(e- 1, f) == 1) || (dfs(e, f - 1) == 1))
//四個方向都要走,而不是三個方向
		return 1;
	return 0;
}
int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf(" %c", &a[i][j]);
		}
	}
	int b=dfs(1,1);
	if (b == 1)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

5.貪心題:Mixing Milk

(題目鏈接:P1208 [USACO1.3] 混合牛奶 Mixing Milk - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

#include<stdio.h>
#include<math.h>
#include<string.h>
 int n, m, p[5200] = { 0 }, a[5200]={0}, max = 0,money=0,sum=0;

void pai_xu(int b[])
{
    for (int i = 1; i <= m-1; i++)
    {
        for(int j=i+1;j<=m;j++)
        {                
            if (b[i] >b[j])
            {
                int t = b[i];
                b[i] = b[j];
                b[j] = t;
                
                int c = a[i];//注意:一定對相應(yīng)可賣數(shù)量進行調(diào)換位置
                a[i] = a[j];
                a[j] = c;
            }
        }
    }
    return;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d", &p[i], &a[i]);
    }
    pai_xu(p);
    //pai_xu(a);//注意:a不用排序,而是在排序函數(shù)里面進行了相應(yīng)調(diào)換
    
        for (int j = 1; j<= m; j++)
        {
            int x = sum;
            sum += a[j];
            if (sum <= n)
                money += p[j] * a[j];
            if (sum > n)
            {
                money += (n - x) * p[j];
                break;
            }
        }
        printf("%d\n", money);
    return 0;
}

6.貪心題:彈珠游戲

(題目鏈接:P2356 彈珠游戲 - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

#include<stdio.h>
#include<math.h>
#include<string.h>
int a[1010][1010] = { 0 },m=0,max=0, hang[1010] = { 0 }, lie[1010] = { 0 };
int main()
{
	int n,i,j,flag=0;
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d", &a[i][j]);			
			hang[i] += a[i][j];/*******/
			lie[j] += a[i][j];/*******/
			if (a[i][j] == 0)
			{
				flag = 1;
			}
		}
	}		
	if ( flag == 0)//沒有一個點是0,即沒有容身之地
	{
		printf("Bad Game!\n");
		return 0;//直接return
	}

	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{			
			if (a[i][j] == 0)
				m = hang[i] + lie[j];
			if (m > max)//更換最大值
			 max=m;
		}
	}
	printf("%d\n",max );
	return 0;
}

7.貪心題:獨木舟

(題目鏈接:題目-獨木舟 (51nod.com))

int n, m, w[10010] = { 0 }, flag = 0;
void pai_xu(int b[])
{
    for (int i = 0; i <= n - 2; i++)
    {
        for (int j = i + 1; j <= n-1; j++)
        {
            if (b[i] > b[j])
            {
                int t = b[i];
                b[i] = b[j];
                b[j] = t;
            }
        }
    }
    return;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &w[i]);
    }
    pai_xu(w);//先對其進行排序
    int sum = n;//注意這里sum是等于n的,后續(xù)再對其進行減減操作
    int i = 0;
    int j = n - 1;//是n-1,而不是n
    while(i<j)
    {
        if (w[i] + w[j] <= m)
        {
            i++;
            j--;
            sum--;
        }
        else
        {
            j--;//只有j改變,i不變
        }
    }
    printf("%d\n", sum);
    return 0;
}

8.貪心題:Chips on the Board

(題目鏈接:Chips on the Board - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

int n, a[300010] = { 0 }, b[300010] = { 0 };
int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
	{
		int minb=1000000001,mina= 1000000001;
		scanf("%d", &n);
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
			mina = a[i] < mina ? a[i] : mina;//核心:是要小的
		}
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &b[i]);
			minb = b[i]<minb?b[i]:minb;//核心:是要小的
		}
		int sum2=0, sum1=0,sum;
		for (int i = 0; i < n; i++)
		{
			sum1 += mina + b[i]; // 核心:是要小的
			sum2 += minb + a[i]; // 核心:是要小的
		}
		sum = sum1 < sum2 ? sum1 : sum2;// 核心:是要小的
		printf("%d\n", sum);
	}
	return 0;
}

9.貪心題:?Longest Divisors Interval

(題目鏈接:Longest Divisors Interval - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

該題一定要開long long,int 類型過不了

該題關(guān)鍵:因數(shù)越小越可能區(qū)間越大

#include<stdio.h>
#include<math.h>
#include<string.h>
#define ll long long
int main()
{
	ll n,t;
	scanf("%lld", &t);
	while (t--)
	{
		ll count = 0,max=0;
		scanf("%lld", &n);
		for (ll i = 1;i<=n; i++)
		{
			if (n % i == 0)
			{
				count++;
				continue;
			}
			else
				break;
		}
		printf("%lld\n", count);
	}
	return 0;
}

10.貪心題:Array Coloring

(題目鏈接:Array Coloring - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))


#include<stdio.h>
#include<math.h>
#include<string.h>
#define ll long long
//該題寫出來很簡單,就是得想到關(guān)鍵:奇數(shù)加奇數(shù)等于偶數(shù),偶數(shù)加偶數(shù)還是偶數(shù),所以其和必定為偶數(shù)才符合
int main()
{
	int n, t, a[55] = { 0 },sum=0;
	scanf("%d", &t);
	while (t--)
	{
		sum = 0;/**/
		scanf("%d", &n);
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
				sum+=a[i];
		}
		if (sum % 2 == 0)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

11.貪心題:?Unit Array

(題目鏈接:Unit Array - 洛谷 | 計算機科學教育新生態(tài) (luogu.com.cn))

//該題關(guān)鍵:算積與和,再根據(jù)其進行情況分類
int main()
{
	int n, t, a[110] = { 0 };
	scanf("%d", &t);
	while (t--)
	{
		int count = 0,sum=0,cheng=1/**/;
		scanf("%d", &n);
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &a[i]);
			sum += a[i];
			cheng *= a[i];
		}
		//情況:
        //sum>=0,cheng<0;
		// sum>=0,cheng>0
		// sum<0,cheng>0
		// sum<0,cheng<0
		if (sum >= 0)
		{
			if(cheng==1)
			printf("0\n");
			else
			printf("1\n");
			continue;
		}
		else
		{
			while (sum < 0)
			{
			    sum += 2;
				cheng *= (-1);
				count++;
			}
			if (cheng == -1)
				count++;
			printf("%d\n", count);
		}
	}
	return 0;
}

以上就是我最近所寫題目中的一部分總結(jié)啦,如果各位有任何對代碼或者本人注釋的建議,都歡迎在評論區(qū)提出來,共同進步?。ńK于熬夜肝完了)文章來源地址http://www.zghlxwxcb.cn/news/detail-768646.html

到了這里,關(guān)于過去一周寫過的算法題的一部分(dfs,貪心)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 常規(guī)技術(shù)面試題(.NET)下一部分

    ?(我只是個努力的搬運工,別人整理的,暫時發(fā)布,供我自己復習的。) 目錄 1.你對泛型了解嗎?簡單說明一下泛型的有什么好處? 6.2 ?.NET WinForm部分 6.3 ?.NET Web開發(fā)部分 6.4 ?數(shù)據(jù)訪問部分 6.5 ?集群與分布式 6.6 ?其他部分 泛型:“泛型”的字面意思就是廣泛的類型。通

    2024年02月08日
    瀏覽(24)
  • git 如何提交一個文件的一部分內(nèi)容

    git 如何提交一個文件的一部分內(nèi)容

    場景: 我正在開發(fā)代碼開發(fā)了一半,現(xiàn)在突然要提交代碼,但是需要提交的代碼和我正在開發(fā)的代碼 在一個文件中,我該如何提交 命令: git add -p (p是patch縮寫) 第一步 :輸入命令之后會呈現(xiàn)代碼修改的部分 綠色的注釋就是新增加內(nèi)容 第二步: 按回車鍵查看命令解釋 這

    2024年02月11日
    瀏覽(17)
  • jenkins漢化一部分問題(一半中文一半英文)解決

    jenkins漢化一部分問題(一半中文一半英文)解決

    安裝中文插件“Locale plugin”和“Localization: Chinese (Simplified)后,先設(shè)置為zh_US重新啟動,再設(shè)置回來 其他插件重啟Jenkins后,又出現(xiàn)了部分中文簡體不翻譯的情況。 方法如下,可以臨時完美修復。 1. 將語言設(shè)定為zh_US,Jenkins切換為英文。 2. 調(diào)用restart重啟Jenkins:http://jenkisn網(wǎng)址

    2024年02月11日
    瀏覽(38)
  • 這些年寫過的花式sql - 第3句 今日流失用戶

    第3句 今日流失用戶 需求: 當日流失用戶的定義:昨天登錄的,今天沒登錄的用戶數(shù) 有一張用戶登錄日志表,有字段 date_stamp(日期時間戳),用戶id(uid)。如果用戶在某天登錄了,該表會有一條記錄。 解析: a 表和b表的連接條件是 uid相同 且時間戳相差一天,a 即前一天,

    2024年02月14日
    瀏覽(26)
  • 第三十一部分:大模型在搜索引擎領(lǐng)域

    在過去的幾年里,搜索引擎技術(shù)發(fā)展迅速,從簡單的查詢到智能的語義搜索和知識圖譜。隨著大模型在自然語言處理(NLP)和計算機視覺等領(lǐng)域的成功應(yīng)用,搜索引擎也開始逐漸引入大模型技術(shù),以提高搜索質(zhì)量和用戶體驗。本文將從大模型在搜索引擎領(lǐng)域的背景、核心

    2024年02月20日
    瀏覽(31)
  • Echarts使用中遇到圖表只顯示一部分的情況

    Echarts使用中遇到圖表只顯示一部分的情況

    ????????在引用完Echarts后,發(fā)現(xiàn)圖只顯示了一小部分,檢查布局也沒有任何問題,然后通過控制臺 檢查,無論怎么去調(diào)它所在容器的寬高都沒有任何的變化,調(diào)canves的寬高也只有拉伸的效果。 ?????????出現(xiàn)這種現(xiàn)象的原因是:Echarts的依賴是惰性的,需要手動設(shè)置r

    2024年02月11日
    瀏覽(30)
  • [云原生] 二進制安裝K8S一部分

    [云原生] 二進制安裝K8S一部分

    目前Kubernetes最新版本是v1.25,但大部分公司一般不會使用最新版本。 目前公司使用比較多的:老版本是v1.15,因為v1.16改變了很多API接口版本,國內(nèi)目前使用比較多的是v1.18、v1.20。 ?組件部署: mater節(jié)點 mater01 192.168.136.100 kube-apiserver kube-controller-manager kube-scheduler etcd ? ? ? ?

    2024年02月22日
    瀏覽(27)
  • Git合并固定分支的某一部分至當前分支

    Git合并固定分支的某一部分至當前分支

    在 Git 中,通常使用 git merge 命令來將一個分支的更改合并到另一個分支。如果你只想合并某個分支的一部分代碼,可以使用以下兩種方法: 首先,從要合并的源分支(即要提取代碼的分支)中創(chuàng)建并切換到一個新的臨時分支。這樣可以在該分支上進行修改,以便選擇性地合

    2024年02月21日
    瀏覽(89)
  • RV1126與RV1109 AI系統(tǒng)設(shè)計概要(一部分)

    RV1126與RV1109 AI系統(tǒng)設(shè)計概要(一部分)

    ????????四核核 Cortex-A7,ARM架構(gòu)V7-A指令,獨立Neon SIMD(一種高級單指令多數(shù)據(jù)擴展指令集,可執(zhí)行并行數(shù)據(jù)處理),與獨立FPU(浮點計算)。 (RV1109雙核A7) ????????每核有32KB L1 I-Cache(一級指令高速緩存),32KB L1 D-Cache(一級數(shù)據(jù)高速緩存) ????????512KB L2 Cache(二極

    2024年02月07日
    瀏覽(24)
  • AD18批量修改一部分或者全部器件位號的方法!

    AD18批量修改一部分或者全部器件位號的方法!

    ? ? ? ?現(xiàn)在任何一個公司嵌入式硬件開發(fā)的主板全都是有很多sheet的,而硬件工程師做的往往也都是在老的圖紙上進行修改或者再設(shè)計,也正因為如此,我們在畫原理圖的時候盡量不要去改動已有部分的位號,以免PCB工程師罵人! 就算自己畫PCB的時候也會暈頭轉(zhuǎn)向! ? ? ?

    2024年01月17日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包