ACM實訓沖刺第四天

【碎碎念】最近的任務有點繁重,所以考慮到實際情況,視頻學習決定放置一段時間,重點是學校的實訓練習題,對于我而言,目標不是優秀/良好,綜合考慮我的實際情況,保佑我及格、順利通過就可!加油!


今日學習任務

1.復習代碼

2.習題(Cleaning Shifts、Vanya and Lanterns)


復習代碼

Anton and Letters(搞定)

#include<stdio.h> 
int main(){int flag[26];for(int i=0;i<=26;i++) flag[i]=0;char tmp;while(tmp!='}'){scanf("%c",&tmp);if(tmp=='}') break;if(tmp<'z'&&tmp>='a'){flag[tmp-'a']++;//需要記憶 }}int cnt=0;//需要記得初始化 for(int i=0;i<26;i++){if(flag[i]>0) cnt++;}printf("%d",cnt);
}

Sum of Digits(搞定)

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>char s[10000];
int sum=0;
int result =0;int main(){scanf("%s",s);while(1){if(strlen(s)==1) break;for(int i=0;i<strlen(s);i++){sum+=s[i]-'0';}itoa(sum,s,10);result++;}printf("%d",result);return 0;
}

寒冰王座(搞定)

#include<stdio.h> 
int main(){int T,i,n,sum;while(scanf("%d",&T)!=EOF){if(T<1||T>100) break;for(i=0;i<T;i++){scanf("%d",&n);if(n<1||n>10000) break;if(n>=300) sum=n%50;else if (n>=150&&n<200) sum=n-150;else if (n>=200&&n<300) sum=n-200;else if (n<150) sum=n;printf("%d\n",sum);}//if(n<1||n>10000) break;}return 0;
}

Charm Bracelet(搞定)

#include <stdio.h>
int main(){//第一行輸入 兩個空格分隔的整數int n,m;scanf("%d %d",&n,&m) ;//定義狀態int dp[12881] ;//初始化dp[i]=0 for(int i=0;i<=m;i++){dp[i]=0;}//轉移方程for(int i=1;i<=n;i++) {//注意  i=1 //定義重量和價值 兩個空格分隔的整數描述魅力i: W i和D iint w,d;scanf("%d %d",&w,&d) ;for(int j=m;j>=w;j--){//注意j>=wif(dp[j-w]+d>dp[j])dp[j]=dp[j-w]+d;}}printf("%d\n",dp[m]);return 0;
}

習題

Cleaning Shifts

如果考試遇到這道題,可以先跳過

思路已掌握

問題

描述:

農夫大衛有一片菜園,同時他有n條狗(1 ≤ n ≤ 25000)來看守。他的每條狗有固定的工作時間,并且一定能在工作時間內好好看守菜園。他把一天的時間分為t個時間段(1 ≤ t ≤ 1000000),分別是從1到t,希望每個時間段都至少有一條狗看守菜園。請你為這些狗分配工作,計算最少需要幾條不同的狗,才能讓每個時間段都至少有一條狗有看守菜園。注意,有可能不論怎么安排,都無法實現這個目標。

輸入:

第一行輸入是以空格分隔的兩個整數n和t。第2行到第n+1行包含每條狗的工作時間,以兩個空格分隔的整數表示,代表著這條狗工作的第一個時間段和最后一個時間段。

輸出:

完成農夫大衛的目標需要的最少的狗的數量。如果不能完成該目標,輸出-1。

樣例1:

輸入:
3 10
1 7
3 6
6 10輸出:
2

樣例2:

輸入:
4 100
21 50
50 81
1 20
80 99輸出:
-1

思路

【挑戰程序設計競賽 2章習題 poj 2376 Cleaning Shifts】 https://www.bilibili.com/video/BV13K421h7n5/?share_source=copy_web&vd_source=c1510692b9cb6018bf78570791d3ee02

代碼思路

  1. 定義結構體與輸入:首先定義了一個結構體node來存儲區間信息,包含起始時間a和結束時間b。通過scanf接收輸入的區間數量n和總時間t,隨后逐個讀取每個區間的起始和結束時間。

  2. 自定義排序:使用cmp函數作為比較器,實現了按區間起始時間升序排列,若起始時間相同則按結束時間降序排列,確保優先選擇結束時間更晚的區間進行覆蓋。通過sort函數對區間進行排序。

  3. 區間覆蓋判斷與計數

    • 首先檢查第一個區間的起始時間是否為1,如果不是,則直接輸出-1,表示無法覆蓋整個區間。
    • 初始化end為第一個區間的結束時間,sum也為end,并設置已使用的區間計數cnt為1。
    • 遍歷排序后的區間列表,對于每個區間,如果它的起始時間在當前已選區間結束時間的下一個位置或之內(即a[i].a<=end+1),則嘗試更新最遠的覆蓋點為兩者中的最大值(通過max(sum, a[i].b))。
    • 如果當前區間的起始時間大于end+1,說明當前區間無法接續前一區間,此時需要判斷是否可以形成新的覆蓋段:如果新區間的起始時間仍然在當前覆蓋段的結束時間之后(即a[i].a>end+1),則直接輸出-1;否則,增加計數器cnt,并將end更新為上一覆蓋段的最遠端點,然后繼續嘗試將當前區間加入覆蓋。
    • 最后,檢查最終覆蓋的最遠端點end是否等于總時間t,如果不等則輸出-1,表示未完全覆蓋;否則輸出cnt作為最少所需區間的數量。

記憶方法

  1. 理解核心邏輯:關鍵是理解區間覆蓋的貪心策略,即優先選擇結束時間更晚的區間來嘗試覆蓋更長的連續時間線。

  2. 掌握排序技巧:記住如何根據問題需求自定義排序規則,這里是為了在遍歷時優先考慮起始時間早且結束時間晚的區間。

  3. 區間迭代的分支處理:熟悉如何在遍歷過程中分情況討論區間能否連續覆蓋,特別是如何通過更新endsum變量來維護當前的覆蓋狀態。

  4. 邊界條件檢查:特別注意代碼中對邊界條件的檢查,比如起始時間不為1的情況,以及最終覆蓋是否完整,這些是決定輸出結果的關鍵。

代碼

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stdio.h>using namespace std;const int N = 1000010;/*
Sample Input3 10
1 7
3 6
6 10
Sample Output2
*/
int n;
struct Range
{int l, r;bool operator< (const Range& W)const{return l < W.l;}
}range[N];int main()
{int st, ed;scanf("%d%d", &n, &ed);st = 1;for (int i = 0; i < n; i++){int l, r;scanf("%d%d", &l, &r);range[i].l = l; range[i].r = r;}sort(range, range + n);int res = 0;bool success = false;for (int i = 0; i < n; i++){int j = i, r = -2e9;//所有區間起點在當前點前的  取終點最遠的那個區間while (j < n && range[j].l <= st){r = max(r, range[j].r);j++;}//如果所有區間都在當前點之前  那就無法覆蓋了 返回-1 跳出if (r < st){res = -1;break;}//選擇區間個數加1res++;//選擇后的所有區間已經覆蓋到終點或者終點之后  那就得到了答案了if (r >= ed){success = true;break;}//更新當前點 繼續下一輪尋找可覆蓋的區間st = r + 1;i = j - 1;}if (!success) res = -1;printf("%d\n", res);return 0;
}

#include <iostream>
#include<algorithm>
#include <stdio.h>
using namespace std;
struct node
{int  a,b;
};
struct node a[2500005];
bool cmp(node a,node b)
{if(a.a==b.a) return a.b>b.b;else return a.a<b.a;
}
//結構體排序的比較函數
int main()
{int  t,n;scanf("%d%d",&n,&t);for(int i=1; i<=n; i++){scanf("%d%d",&a[i].a,&a[i].b);}
//習慣從1開始寫sort(a+1,a+1+n,cmp);
//排序if(a[1].a!=1){printf("-1\n");return 0;}
//如果開頭值都做不到等于1,那不管后面如何肯定覆蓋不了所有區間int end=a[1].b,sum=end,cnt=1;
//因為先確定了end,所以cnt的值為1for(int i=2; i<=n; i++){if(a[i].a<=end+1){sum=max(sum,a[i].b);}
//若每次比較的左斷點在上一段區間的里面或等于end+1即end的旁邊,就不斷進行比較滿足條件中最遠的點,即sum最大。else{end=sum;if(a[i].a>end+1){printf("-1\n");return 0;}else{cnt++;if(a[i].a<=end+1){sum=max(sum,a[i].b);}}}}if(end!=sum){cnt++;end=max(sum,end);}if(end!=t) printf("-1\n");else printf("%d\n",cnt);return 0;
}

Vanya and Lanterns

問題

一條長為?L?的路,在坐標軸上范圍是?[0,L],在?n個位置都放置了路燈,燈光能覆蓋的半徑相同,問半徑至少為多少時燈光可以覆蓋整條路。

Input

第一行包含兩個整數?n,l(1≤n≤1000,1≤L≤109)分別代表路燈的數量和這條路的長度。
第二行包含?n個整數?ai(0≤ai≤L),即各個路燈所在的位置。
注意:多個路燈可能在同一位置,而且可能有路燈位于這條路的端點。

Output

輸出一個精確到小數點后?99?位的實數?r,代表能使燈光可以覆蓋整條路的情況下,路燈燈光半徑的最小值。

思路

解題說明:題目的意思是有一條長度為 l 的街道,在這條街道上放置了n個相同的燈,設從一端位置為0,每個燈的位置在ai處,問燈的最小照射半徑為多少時,才能滿足整條街道都能被燈光照到。此題可以用貪心來做,由于除了兩端的兩個燈之外,每兩個燈之間都是由兩個燈共同照射的,故只需要求出兩兩燈之間的距離一半的最大值,再求出兩端兩個燈距離街道兩端盡頭的距離,三者的最大值就是所求的最小半徑。

代碼

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;double ans=0;//半徑 
int n;//路燈數量 
int l;//路的長度 
double loc[1001];//路燈所在位置 int main(){scanf("%d %d",&n,&l);for(int i=0;i<n;i++)//路燈的位置 scanf("%lf",&loc[i]);sort(loc,loc+n) ;for(int i=0;i<n;i++)//兩兩比較,求路燈最大值 ans=max(ans,(loc[i]-loc[i-1])/2.0) ;if(loc[0]!=0)//起始無路燈ans=max(ans,loc[0]) ;if(loc[n-1]!=l)//終點無路燈ans=max(ans,l-loc[n-1]) ;printf("%.010lf\n",ans);return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10458.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10458.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過自建鏡像方式搭建RabbitMQ集群

通過自建鏡像方式搭建RabbitMQ集群 1. 應用準備1.1 應用目錄結構1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 編寫DockerFile2.1 將所有本地文件拷貝到工作目錄2.2 拷貝文件到源目錄&增加執行權限2.3 安裝Erlang & rab…

Leedcode題目:移除鏈表元素

題目&#xff1a; 這個題目就是要我們將我們的鏈表中的值是val的節點刪除。 我們題目提供的接口是 傳入了指向一個鏈表的第一個節點的指針&#xff0c;和我們要刪除的元素的值val&#xff0c;不只要刪除第一個&#xff0c; 思路 我們這里可以創建一個新的鏈表&#xff0c;…

【C++】學習筆記——模板進階

文章目錄 十一、模板進階1. 非類型模板參數2. 按需實例化3. 模板的特化類模板的特化 4. 模板的分離編譯 未完待續 十一、模板進階 1. 非類型模板參數 模板參數分為類型形參和非類型形參 。類型形參即&#xff1a;出現在模板參數列表中&#xff0c;跟在class或者typename之類的…

掌握SEO優化的關鍵:提升網站排名的秘籍(如何提高網站seo排名)

你是否曾經在搜索引擎上搜索過一個關鍵詞&#xff0c;然后點擊了排在前幾位的網站&#xff1f;如果是&#xff0c;那么你已經體會到了SEO&#xff08;搜索引擎優化&#xff09;的威力。SEO是一項關鍵的網絡營銷策略&#xff0c;它能夠讓你的網站在搜索引擎中獲得更高的排名&…

Apache ECharts

Apache ECharts介紹&#xff1a; Apache ECharts 是一款基于 Javascript 的數據可視化圖表庫&#xff0c;提供直觀&#xff0c;生動&#xff0c;可交互&#xff0c;可個性化定制的數據可視化圖表。 官網地址&#xff1a;https://echarts.apache.org/zh/index.html Apache ECh…

Stable Diffusion寫真完整教程

前言 最近自己對AI非常癡迷&#xff0c;并且今后也會一直在這個領域深耕&#xff0c;所以就想著先入門&#xff0c;因此花時間研究了一番&#xff0c;還好&#xff0c;出了點小成果&#xff0c;接下來給大家匯報一下。 AI繪畫 提到AI繪畫&#xff0c;大家可能立馬會想到made…

A-loam建圖算法

A-LOAM構建3d點云地圖并實時轉存二維柵格地圖 A-loam算法。源代碼用的是velodyne雷達話題&#xff0c;但是現在用rslidar來處理。所以也會遇到另外一個包來轉換相關的數據。 git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.githttps://github.com/HViktorTsoi/r…

重慶市工程技術生態環境專業職稱申報條件

重慶市工程技術生態環境專業職稱申報條件鏈接重慶市人力資源和社會保障局 重慶市生態環境局關于印發重慶市工程技術生態環境專業職稱申報條件的通知_重慶市人力資源和社會保障局類別基本條件業績成果備注工程師具備博士學位&#xff1b;或具備碩士學位或第二學士學位&#xff0…

cin.ignore()函數和stoll函數

cin.ignore()函數 cin.ignore() 是一個非常實用的函數&#xff0c;主要用于控制輸入流 cin 的行為 cin.ignore(int n 1, char delimiter EOF); n&#xff1a;一個整數參數&#xff0c;表示要忽略的字符數量。默認值是1&#xff0c;意味著只忽略下一個字符。delimiter&#x…

Android 屏幕適配全攻略(下)-百變屏幕無壓力,這才是Android屏幕適配的終極解決方案

在上一篇文章中&#xff0c;我們介紹了Android屏幕適配的基本方法&#xff0c;比如使用限定符資源、圖片適配、矢量圖等。 感興趣的朋友&#xff0c;請前往查閱&#xff1a;Android 屏幕適配全攻略&#xff08;中&#xff09;-從九宮格到矢量圖&#xff0c;揭秘Android多屏幕適…

模擬集成電路(3)----單級放大器(共源極)

模擬集成電路(3)----單級放大器&#xff08;共源極&#xff09; 放大是模擬電路的基本功能 大多數自然模擬信號太小而無法處理需要足夠的信噪比 理想的放大器 線性&#xff1a;無限的幅度和頻率范圍 輸入阻抗無限大 輸出阻抗無限小 共源放大器 共源放大器就是將源極接A…

01面向類的講解

指針指向類成員使用 代碼&#xff1a; #include<iostream> using namespace std;class Test { public:void func() { cout << "call Test::func" << endl; }static void static_func();int ma;static int mb; //不依賴對象 }; void Test::static…

JavaScript 動態網頁實例 —— 事件處理應用

前言 事件處理的應用很廣泛。在事件處理的應用中,鼠標事件的應用是最常用到的。本章給出幾個鼠標事件處理應用的示例,包括:頁面預覽、圖像切換、點亮文本、鼠標跟隨、鼠標感應和禁用鼠標按鍵。在這些示例中,有的可以直接拿來應用,有的則只提供了一種應用的方法,稍加拓展,…

示例十一、聲音傳感器

通過以下幾個示例來具體展開學習,了解聲音傳感器原理及特性&#xff0c;學習聲音傳感器的應用&#xff08;干貨版&#xff09;&#xff1a; 示例十一、聲音傳感器 ino文件源碼&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

機器學習-無監督學習

無監督學習是機器學習和人工智能的另一個重要分支&#xff0c;它主要處理沒有標簽的數據集&#xff0c;目的是發現數據中的隱藏模式、結構或異常。無監督學習不依賴于預先定義的輸出&#xff0c;而是讓算法自己揭示數據的本質特征。 無監督學習的過程通常包括以下幾個步驟&…

標準服務器控件

文本類型控件 通常指的是用于輸入或顯示文本的控件。 TextBox&#xff1a;這是最基本的文本輸入控件。它允許用戶在頁面上輸入文本。你可以設置它的屬性來控制其行為&#xff0c;如MaxLength&#xff08;限制輸入的最大字符數&#xff09;、ReadOnly&#xff08;是否只讀&…

【C/C++筆試練習】DNS設置文件、應用層、Dos攻擊、DNS服務、DNS、子網劃分、http狀態、路由設置、TCP連接、HTTP狀態碼、剪花布條、客似云來

文章目錄 C/C筆試練習選擇部分&#xff08;1&#xff09;DNS設置文件&#xff08;2&#xff09;應用層&#xff08;3&#xff09;Dos攻擊&#xff08;4&#xff09;DNS服務&#xff08;5&#xff09;DNS&#xff08;6&#xff09;子網劃分&#xff08;7&#xff09;http狀態&am…

docker01-簡介和概述

什么是docker&#xff1f; 我們現在開發項目是在windows操作系統使用idea開發&#xff0c;本地windows操作系統上有我們項目所需的jdk&#xff0c;mysql&#xff0c;redis&#xff0c;tomcat等環境&#xff0c;如果我們想打包我們的項目到一個別的服務器上&#xff0c;在別的服…

【Apache POI】Apache POI-操作Excel表格-簡易版

Catalog Apache POI-操作Excel表格1. 需求2. 優點3. 缺點4. 應用場景5. 使用方法6. SpringBoot工程中處理Excel表格7. Demo示例 Apache POI-操作Excel表格 1. 需求 大多數項目的在運營過程中&#xff0c;會產生運營數據&#xff0c;如外賣系統中需要統計每日的訂單完成數、每…

SpringBoot實現圖片驗證碼

引入依賴 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version> </dependency>代碼實現 package com.qiangesoft.captcha.controller;import com.wf.captcha.*…