Educational Codeforces Round 156 (Rated for Div. 2)補題

Sum of Three

題目大意:將一個正整數n分成3個不同的正整數x,y,z,保證三個數都不能整除3,如果無法實現就輸出NO.

思路:這個題實際上特別簡單,我們可以發現當n比較大的時候,我們可以從中取1,然后第二個數也是取一個個位數就能得到答案。所以我們直接暴力。

#include<bits/stdc++.h>
using namespace std;
int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);int flag=0;for(int i=2;i<n;i++){if(i%3&&(n-i-1)%3&&i!=(n-1-i)&&i!=1&&n-i-1!=1&&i>0&&n-i-1>0) {flag=1;printf("YES\n");printf("1 %d %d\n",i,n-i-1);break;}}if(!flag) printf("NO\n"); }
}

Fear of the Dark

題目大意:我們要從點(0,0)到點P,現在有A,B兩個燈籠,分別在(xa,ya),(xb,yb)位置處,我們可以調節功率,也即燈光的半徑,最終要實現從O到P都是被照亮的,求最小的功率。

思路:這題要求最小的功率,首先想到二分,那么現在的問題就是check函數怎么寫,實際上合法的只有三種情況,O,P同在A中,同在B中,一個在A,一個在B,A和B相交或者相切。不過這道題還有一點麻煩的是輸出的結果要是小數,誤差不超過1e-6,這個可以通過設置循環退出的判斷條件來實現,現在關鍵的還是check函數,我們可以預先計算出O和P到A和B的距離,然后確定一個半徑后就可以判斷在OP是否在AB中,以及上面的三種情況是否至少有一種能滿足。

#include<bits/stdc++.h>
using namespace std;
double dmax(double a,double b)
{if(a>b) return a;else return b;
}
double pa,pb,oa,ob,ab;
int check(double x)
{int cpa=0,cpb=0,coa=0,cob=0;if(pa<=x) cpa=1;if(pb<=x) cpb=1;if(ob<=x) cob=1;if(oa<=x) coa=1;if(cpa&&coa) return 1;//同在aif(cpb&&cob) return 1;//同在bif((cpb&&coa)||(cpa&&cob))//一個在a,一個在b{if(ab<=2*x) return 1;//ab相切或相交else return 0;}return 0;
}
int main()
{int t;scanf("%d",&t);while(t--){double xp,yp,xa,ya,xb,yb;scanf("%lf%lf%lf%lf%lf%lf",&xp,&yp,&xa,&ya,&xb,&yb);pa=sqrt((xp-xa)*(xp-xa)+(yp-ya)*(yp-ya)),pb=sqrt((xp-xb)*(xp-xb)+(yp-yb)*(yp-yb)),oa=sqrt((xa)*(xa)+(ya)*(ya)),ob=sqrt((xb)*(xb)+(yb)*(yb));ab=sqrt((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya));double mx=dmax(pa,pb);mx=dmax(mx,oa);mx=dmax(mx,ob);double l=0,r=mx;while(r-l>1e-8){double mid=(l+r)/2;if(check(mid)) r=mid;else l=mid;}	printf("%.8lf\n",l);}
}

ps:對于浮點數的二分,每次更新直接將mid賦值給l或者r即可。

Decreasing String

題目大意:我們現有一個字符串s1,我們刪除一個字符生成s2,使s2是所有情況中字典序最小的,然后從s2中刪除一個字符得到s3,要求一樣,是所有情況中字典序最小的,以此類推到僅有一個字母的字符串sm,我們將這些都拼起來得到s=s1+s2+s3+...+sm,現在要求的是s的第k位是什么字符,s中的下標從1開始。

思路:這題很明顯是貪心,要找到一個最優的刪除策略,我們先就樣例討論一下:

cab

ab

b

這個是最優的刪法,可以發現a<c,且a在c后面,所以將c刪掉可以降低字典序

然后對于ab,b的字典序大于a,那么就將b刪除。

以此類推,一個字符串中后一個字母的字典序如果小于前一個字符,那么將前一個字母刪掉,肯定是優解,而且因為字典序是從前往后比的,所以我們刪除的位置越靠前越好。

?那么刪除的策略就得到了,先正序遍歷,如果后一個字母的字典序小于前一個字母的字典序,就將其刪除,最后得到一個字典序非遞減的序列,然后再從后往前刪除。但是我們注意到,一個字母可能不止小于前面一個,可能小于前面好幾個,但是前面的那好幾個是非減的關系,在它們被訪問的時候不會被刪除,所以我們對于一個小的出現時要往前遍歷,不能刪一個就往后遍歷去了,因為我們最后想要的是一個非遞減的字符串。

然后我們再來考慮,因為字符串的長度最大到1e6,肯定不能真的暴力把s生成,然后遍歷去找第k位,那么就要想一想,有什么可以替代的方法。

我們在遍歷的過程中,每刪除一個字母,就相當于生成了一個長度比上一個小1的字符串,那么我們將這些長度累計起來(sum),不就相當于得到了目前已經拼接的字符串的長度,一旦它大于等于k,那么第k位的字符肯定在我們當前的這個字符串中。然后我們就要來考慮,如何可以得到我們當前的字符串。

我們用一個臨時變量tmp來存沒有在遍歷中被彈出的字母,這個思路有點像YetnotherrokenKeoard,我們只考慮哪些是實際能夠出現在結果中的,然后當sum>=k的時候退出遍歷,然后將后面還沒訪問到的字符全部放入tmp中,得到的字符串就是我們當前的字符串,因為刪除操作都發生在它前面,然后我們只統計了沒有被刪除的字母,然后將后面沒刪除的字母也放進去,那么得到的自然是我們想要的當前字符串,因為被刪的都去掉了,只留下了沒被刪的,那么自然是我們想要的。

然后就要從這個字符串中找我們的結果,首先肯定要把這個字符串前面生成的那些字符串的長度從k中減掉,才能知道我們想要的結果,在當前字符串中是第幾位,這個的計算可以用等差數列公式來算(這里需要累計一下,我們當前的字符串是第幾個字符串)

s1 len

s2 len-1

s3 len-2

sm len-m+1

alllen=(len+len-m+1)*m/2

然后在這個字符串中找目標位置即可。

另外還有一種情況需要考慮,就是我們已經得到了一個非遞減的字符串tmp后,總長度還是小于k,那么這種情況下就要從后往前來彈出,進而生成新字符串,剩下的處理和上面類似。

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{int t;scanf("%lld",&t);while(t--){string s,tmp="";cin>>s;int k;scanf("%lld",&k);int l=s.size(),sum=s.size(),i,c=1;for(i=0;i<s.size()-1;i++){if(sum>=k) break;tmp += s[i];if(s[i+1]<s[i]) {int j=tmp.size()-1,d=i+1;while(s[d]<tmp[j]&&tmp.size())//雖然比前面的小,但是前面那個根本沒被放進去,所以我們只用考慮被放入的那些{l -= 1, sum += l,c++;//新生成一個字串tmp.pop_back();if(sum>=k) break;j--;}}}for(i=i;i<s.size();i++) tmp += s[i];if(sum>=k){c--;int len=s.size();k-=(len+len-c+1)*c/2;//答案在此時的tmp中,但是要確定是第幾個,那么就要將前面的都減掉for(int j=0;j<tmp.size();j++){if(j+1==k) {cout<<tmp[j];break;}}}else{for(int i=tmp.size();i>=0;i--){l -= 1,sum += l,c++,tmp.pop_back();if(sum>=k) break; //加上此時的tmp后超了}c--;int len=s.size();k-=(len+len-c+1)*c/2;for(int j=0;j<tmp.size();j++){if(j+1==k) {cout<<tmp[j];break;}}}}
}

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

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

相關文章

【Java】Java環境以及EditPlus編輯器安裝與配置流程

要安裝和配置Java環境以及EditPlus編輯器&#xff0c;請按照以下步驟操作&#xff1a; ### 安裝Java Development Kit (JDK) 1. 訪問Java官方網站下載最新版本的JDK。 2. 運行下載的JDK安裝程序&#xff0c;并按照提示完成安裝。 3. 安裝完成后&#xff0c;記下JDK的安裝路徑&a…

perf與火焰圖-性能分析工具

參考鏈接 perf性能分析工具使用分享 如何讀懂火焰圖&#xff1f;-阮一峰 perf基本用法-record,report-知乎 火焰圖抓取 準備&#xff1a; centos安裝perf工具 dnf install perf下載火焰圖解析代碼 git clone https://github.com/brendangregg/FlameGraph.git抓取指定進程…

Orcal數據庫Schema理解、表分區理解

目錄 1 Schema1.1 Orcal數據庫示例1.2 MySQL數據庫示例 2 Orcal表分區2.1 創建表分區2.2 查看表分區2.3 查看指定分區數據 此前未了解過Schema的概念&#xff0c;僅知道Orcal數據庫比較側重這個概念&#xff0c;搜遍全網都&#xff0c;都是啰哩吧嗦的搬抄定義&#xff0c;特此在…

LeetCode算法題解(單調棧)|LeetCode503. 下一個更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一個更大元素 II 題目鏈接&#xff1a;503. 下一個更大元素 II 題目描述&#xff1a; 給定一個循環數組 nums &#xff08; nums[nums.length - 1] 的下一個元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每個元素的 下一個更大元素 。 數字 x 的…

LIMoE:使用MoE學習多個模態

文章鏈接&#xff1a;Multimodal Contrastive Learning with LIMoE: the Language-Image Mixture of Experts 發表期刊&#xff08;會議&#xff09;: NeurIPS 2022 目錄 1.背景介紹稀疏模型 2.內容摘要Sparse Mixture-of-Experts ModelsContrastive LearningExperiment Analy…

Kubernetes入門筆記 ——(3)理解pod對象

為什么需要pod 最為熟知的一句話&#xff1a;pod是k8s的最小調度單位。剛開始聽到這句話時會想&#xff0c;已經有容器了&#xff0c;k8s為什么還要搞個pod出來&#xff1f;容器和pod是什么關系&#xff1f;容器的本質是進程&#xff0c;而k8s本質上類似操作系統。 熟悉Linux的…

SpringBoot系列之啟動成功后執行業務的方法歸納

SpringBoot系列之啟動成功后執行業務邏輯。在Springboot項目中經常會遇到需要在項目啟動成功后&#xff0c;加一些業務邏輯的&#xff0c;比如緩存的預處理&#xff0c;配置參數的加載等等場景&#xff0c;下面給出一些常有的方法 實驗環境 JDK 1.8SpringBoot 2.2.1Maven 3.2…

python dataframe 列中 字符串( ‘2815512706605‘)過大 轉不了float 用Decimal

from decimal import Decimaldf["accFillSz"] df["accFillSz"].apply(lambda x: Decimal(x)) 2815512706605這個值超出了Python中float類型的最大表示范圍,無法直接轉換為浮點數。 Python中float類型使用IEEE 754標準的64位雙精度浮點數表示,最大值大約為…

歐拉回路歐拉路【詳解】

1.引入 2.概念 3.解決方法 4.例題 5.回顧 1.引入 經典的七橋問題 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含兩個島嶼及連接它們的七座橋&#xff0c;如下圖所示。 可否走過這樣的七座橋&#xff0c;而且每橋只走過一次&#xff1f; 你怎樣證明&#xff1f;…

【Linux top命令】

文章目錄 深入了解Linux top命令&#xff1a;實時監控系統性能1. 什么是top命令&#xff1f;2. 使用top命令3. top命令交互操作 深入了解Linux top命令&#xff1a;實時監控系統性能 1. 什么是top命令&#xff1f; top命令是一個用于實時監控系統性能的文本界面工具。它顯示當…

Linux上使用獨立顯卡Tesla T4(測試視頻壓縮)

背景 將視頻處理程序單獨部署至K8S之外&#xff0c;使用獨立GPU顯卡的一臺服務器上。 需事先對GPU性能做簡單測試。 已通過zabbix對Linux進行了系統資源監控。 已通過PrometheusGrafana對顯卡Tesla T4做了性能監控。 逐步補充&#xff0c;稍等 2023年12月6日 操作 查看當前…

鴻蒙Harmony開發初探

一、背景 9月25日華為秋季全場景新品發布會&#xff0c;余承東宣布鴻蒙HarmonyOS NEXT蓄勢待發&#xff0c;不再支持安卓應用。網易有道、同程旅行、美團、國航、阿里等公司先后宣布啟動鴻蒙原生應用開發工作。 二、鴻蒙Next介紹 HarmonyOS是一款面向萬物互聯&#xff0c;全…

[Linux] 基于LAMP架構安裝論壇

一、安裝Discuz論壇 1.1 創建數據庫&#xff0c;并進行授權 mysql -u root -p123CREATE DATABASE bbs; #創建一個數據庫GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs數據庫里面所有表的權限授予給bbsuser,并設置密碼admin123flush privileges; #刷新數據庫…

Java 中的抽象類與接口:深入理解與應用

文章目錄 什么是抽象類&#xff1f;什么是接口&#xff1f;抽象類和接口的使用場景抽象類和接口的區別結論 在 Java 編程語言中&#xff0c;抽象類和接口是兩種重要的機制&#xff0c;用于實現抽象化和多態性。這兩種機制都允許我們定義一種通用的類型&#xff0c;然后通過繼承…

數據結構——棧與棧排序

棧的特性 棧是一種遵循后進先出&#xff08;LIFO&#xff09;原則的數據結構。其基本操作包括&#xff1a; push&#xff1a;將元素添加到棧頂。pop&#xff1a;移除棧頂元素。peek&#xff1a;查看棧頂元素&#xff0c;但不移除。 棧排序的原理 棧排序的核心是使用兩個棧&…

[滲透測試學習] Devvortex - HackTheBox

文章目錄 信息搜集解題步驟提交flag 信息搜集 掃描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.242發現80端口有http服務&#xff0c;并且是nginx服務 嘗試訪問web界面&#xff0c;發現跳轉到http://devvortex.htb/無法訪問 我們用vim添加該域名即可 sudo vim /etc/…

J.408之數據結構

J-408之數據結構_北京信息科技大學第十五屆程序設計競賽&#xff08;同步賽&#xff09; (nowcoder.com) 思維好題&#xff0c;直接用兩個set存沒出現的數字就好了 // Problem: 408之數據結構 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…

ClickHouse安裝和部署

ClickHouse安裝過程&#xff1a; ClickHouse支持運行在主流64位CPU架構&#xff08;X86、AArch和PowerPC&#xff09;的Linux操作 系統之上&#xff0c;可以通過源碼編譯、預編譯壓縮包、Docker鏡像和RPM等多種方法進行安裝。由于篇幅有限&#xff0c;本節著重講解離線RPM的安…

RAW和YUV的區別

RAW是指未經過任何壓縮或處理的原始圖像數據。在攝像頭中&#xff0c;原始圖像數據可以是來自圖像傳感器的未經處理的像素值。這些原始數據通常以一種Bayer模式的形式存在&#xff0c;其中每個像素僅包含一種顏色信息&#xff08;紅色、綠色或藍色&#xff09;&#xff0c;需要…

【開源】基于Vue和SpringBoot的在線課程教學系統

項目編號&#xff1a; S 014 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S014&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S014&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 系統介紹1.2 項目錄屏 二、研究內容2.1 課程類型管理模塊2.2 課程管理模塊2…