Codeforces 1027 Div3(ABCDEF)

前言

無敵!!第一次打Div3,因為之前打Div4賽時也就三四題,所以在打之前根本沒想到自己能做到賽時三題!!雖然第三題是離結束十幾秒的時候交的,沒想到判完題比賽結束了還不算賽時通過……TvT

A. Square Year

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{string s;cin>>s;int num=0;for(int i=0;i<4;i++){num=num*10+s[i]-'0';}int sq=sqrt(num);if(sq*sq==num){cout<<0<<" "<<sq<<endl;}else{cout<<-1<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

這個題說實話有點惡心,感覺一開始題意不是很明確,沒寫隨便輸出一個即可,所以還對著用例想了半天。

隨便輸出一個那就簡單了,那就是如果能開方就直接輸出0和開平方后的數,不能就直接-1即可。

B. Not Quite a Palindromic String

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;//賽時暴力解
void solve1()
{int n,k;cin>>n>>k;string s;cin>>s;int m=s.length();if(k>m/2){cout<<"NO"<<endl;return ;}int cnt=0,cntA=0,cntO=0,cntX1=0,cntX2=0;for(int i=0,j=m-1;i<=j;i++,j--){if(s[i]!=s[j]){if(s[i]=='1'){cntX1++;}else{cntX2++;}}else if(s[i]==s[j]){if(s[i]=='1'){cnt++;cntA++;            }else{cnt++;cntO++;}}}if(cnt==k){cout<<"YES"<<endl;return ;}if((k%2==0&&cnt%2==0)||(k%2==1&&cnt%2==1)){if(k<cnt){if(min(cntA,cntO)>=(cnt-k)/2){cout<<"YES"<<endl;return ;}else{cout<<"NO"<<endl;return ;}}else{if(max(cntX1,cntX2)>=(k-cnt)/2){cout<<"YES"<<endl;return ;}else{cout<<"NO"<<endl;return ;}}}else{cout<<"NO"<<endl;return ;}}//優化解
void solve2()
{int n,k;cin>>n>>k;string s;cin>>s;int m=s.length();//因為要求k對“00”或“11”,所以剩下的n/2-k對都是“01”//所以保證0和1的數量減去n/2-k是偶數即可//統計出現次數vector<int>cnts(2);for(int i=0;i<m;i++){cnts[s[i]-'0']++;}int zeros=cnts[0]-(n/2-k);int ones=cnts[1]-(n/2-k);if(zeros>=0&&zeros%2==0&&ones>=0&&ones%2==0){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve2();    }return 0;
}

這個題真的太草了,賽時完全想復雜了,雖然調了半天調出來了,但浪費了不少時間……

賽時想到的麻煩思路是,從要求的k和實際的cnt入手,分析兩者奇偶性對結果的影響。因為交換后必然是兩對兩對地增加,兩對兩對地減少,所以只有當k和cnt奇偶性一致時才有可能湊出來。(很妙,但沒用)

之后就去討論k和cnt的大小關系。當k小于cnt時,需要通過交換減少個數,那就只能讓“00”和“11”交換,一次消去兩對,所以就要分別統計“00”和“11”的個數。只有當這倆個數的最小值比k和cnt差值的兩倍大時才有可能湊出來。

當k大于cnt時,就需要通過交換增加個數,此時就需要讓“01”和“10”的組合交換。注意,在上一個情況里,必須是在同一側的兩數交換,才能減少個數,所以是兩者最小值。而這里,除了上述情況,還可以讓兩對“01”中其中一組的“0”和另一組的“1”交換,仍然可以消去一對。所以在這里就是取兩者的最大值,要注意的是,這里需要在一開始進行剪枝,先把k大于m/2的情況剪了才行。

優化解就簡單很多了,因為匹配的情況就是“00”和“11”兩種,不匹配就是“01”和“10”兩種,所以當要求有k對匹配時,不匹配的數量就是n/2-k。所以考慮先統計一遍0和1的詞頻,之后減去不匹配的數量就是需要的數量。當兩者都大于0且是偶數時,就可以被交換出來。

怎么說呢,感覺這個優化解的思路太需要觀察了……我賽時還想著怎么個調換法,這個直接從一般規律入手了,差距好大……

C. Need More Arrays

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{int n;cin>>n;vector<int>a(n);for(int i=0;i<n;i++){cin>>a[i];}vector<int>b;b.push_back(a[0]);for(int i=1,j=0;i<n;i++){if(a[j]+1<a[i]){b.push_back(a[i]);j=i;}}cout<<b.size()<<endl;;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

這個題純純貪心,本來以為沒戲了,沒想到最后二十分鐘真給我貪出來了,還是一發過。(驕傲)

根據原題意,其實就是要讓這個數組不連續。那么貪心的思路就是,從前往后遍歷這個數組,一旦發現有連續的部分就直接刪除靠后的元素,因為這樣只會導致后續可能對答案有增益,不會導致答案減少。(說實話,我都不知道我咋能想到這個貪心)

所以就是遍歷數組,設置指針j記錄上一個沒刪除的下標。然后如果連續就刪除,否則就加到新數組里,然后j來到當前位置,最后返回新數組的大小即可。

D. Come a Little Closer

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{int n;cin>>n;vector<vector<ll>>mon(n,vector<ll>(2));for(int i=0;i<n;i++){cin>>mon[i][0]>>mon[i][1];}//特判if(n==1){cout<<1<<endl;return ;}ll ans=1e18+100;multiset<ll>xs,ys;for(int i=0;i<n;i++){xs.insert(mon[i][0]);ys.insert(mon[i][1]);}//計算所有的面積ans=min(ans,(*xs.rbegin()-*xs.begin()+1)*(*ys.rbegin()-*ys.begin()+1));//枚舉每個移動的怪獸for(int i=0;i<n;i++){xs.erase(xs.find(mon[i][0]));ys.erase(ys.find(mon[i][1]));//統計可以縮小的答案ll tmp=(*xs.rbegin()-*xs.begin()+1)*(*ys.rbegin()-*ys.begin()+1);//剩余構成的長方形是滿的if(tmp==n-1){//加上長寬的最小值 -> 移動到周圍tmp+=min(*xs.rbegin()-*xs.begin()+1,*ys.rbegin()-*ys.begin()+1);}ans=min(ans,tmp);//放回去xs.insert(mon[i][0]);ys.insert(mon[i][1]);}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

這個題因為不知道multiset所以還卡了一會……

multiset就是允許存在重復元素的set,因為最多可以移動怪獸一次,所以肯定考慮枚舉每個怪獸,看看移動之后能否使答案減小。所以有了multiset就可以把所有點放到set里,然后每次根據set中的最小值和最大值把要刪除的整個格子抓出來。之后枚舉每個怪獸,每次先在set中刪除,接著統計答案,最后插回去即可。注意,若格子滿了,即面積等于怪獸的數量,那就讓當前怪獸去到長寬更小的那邊,需要增加的就是長寬的最小值。

E. Kirei Attacks the Estate

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;const int MAXN=200005;//鏈式前向星建樹
// int head[MAXN];
// int nxt[MAXN<<1];
// int to[MAXN<<1];
// int cnt=1;// void build(int n)
// {
//     fill(head,head+MAXN,0);
//     fill(nxt,nxt+(MAXN<<1),0);
//     fill(to,to+(MAXN<<1),0);
// }// void addEdge(int u,int v)
// {
//     nxt[cnt]=head[u];
//     to[cnt]=v;
//     head[u]=cnt++;
// }//dfs
void dfs(int u,int father,vector<vector<ll>>&ans,vector<ll>&weight,vector<vector<int>>&graph)
{ans[u][0]=max(weight[u],weight[u]-ans[father][1]);ans[u][1]=min(weight[u],weight[u]-ans[father][0]);// for(int ei=head[u],v;ei>0;ei=nxt[ei])// {//     v=to[ei];//     if(v!=father)//     {//         dfs(v,u,n,weight);//     }// }for(int cur:graph[u]){if(cur!=father){dfs(cur,u,ans,weight,graph);}}
}void solve()
{int n;cin>>n;vector<ll>weight(n+1);for(int i=1;i<=n;i++){cin>>weight[i];}//build(n);vector<vector<int>>graph(n+1);for(int i=1,u,v;i<=n-1;i++){cin>>u>>v;// addEdge(u,v);// addEdge(v,u);graph[u].push_back(v);graph[v].push_back(u);}//0:max  1:minvector<vector<ll>>ans(n+1,vector<ll>(2,0));dfs(1,0,ans,weight,graph);for(int i=1;i<=n;i++){cout<<ans[i][0]<<" ";}cout<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

真的抽象,沒想到鏈式前向星性能會比鄰接表差好多,同樣思路鏈式前向星直接TLE了……不過很好的一點是思路自己在補題的時候想到了!!

這個題其實就是個樹型dp,觀察給出的式子就能發現,當前節點的威脅值其實就是兩種情況,自己單獨和自己節點減去父節點的威脅值。而又因為要求當前節點的威脅值最大,所以就要求減去的父節點的威脅值最小。那么就考慮用dfs往下扎,同時收集當前節點威脅值的最大值和最小值即可。

F. Small Operations

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;//最大公約數
int gcd(int a,int b)
{if(b>a){int tmp=b;b=a;a=tmp;}return b==0?a:gcd(b,a%b);
}//質因子
vector<int>factors(int n)
{vector<int>ans;for(int i=2;i*i<=n;i++){while(n%i==0){if(ans.empty()||ans.back()!=i){ans.push_back(i);}n/=i;}}if(n!=1){ans.push_back(n);}return ans;
}//約數
vector<int>divisors(int n)
{vector<int>ans;for(int i=n;i>=1;i--){if(n%i==0){ans.push_back(n/i);}}return ans;
}//把1乘到n的最小次數 -> 貪心是不對的,正解是按乘積bfs展開路徑
int check(int n,int k)
{if(n==1){return 0;}//往上乘的過程中,每一步的結果必然是n的約數vector<int>div=divisors(n);set<int>cur;//當前層結果cur.insert(1);for(int i=1;;i++){set<int>next;//下一層for(int x:cur){for(int y:div){if(y>k){break;}next.insert(x*y);}}if(next.find(n)!=next.end())//乘出n{return i;}cur=next;}return 0;
}void solve()
{int x,y,k;cin>>x>>y>>k;//先讓兩者同除一個最大公約數//之后先讓x變為1,然后再乘到yint t=gcd(x,y);x/=t;y/=t;//若兩者任意一個存在一個質因子大于k//那么不可能把x除到1或把1乘到y,所以必不可能完成for(int t:factors(y)){if(t>k){cout<<-1<<endl;return ;}}for(int t:factors(x)){if(t>k){cout<<-1<<endl;return ;}}int ans=check(x,k)+check(y,k);cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

數學題拼盡全力無法戰勝了……

首先可以發現,上來可以求x和y的最大公約數,然后讓兩者同除這個最大公約數,然后考慮除完的結果,這樣不會對答案造成影響。之后的思路是先把x除到1,再從1乘到y。所以,對于無法完成的情況,那就是要分別取兩者的質因數,若存在一個質因子大于k,那么就必然不可能完成。判斷完之后,因為從一個數除到1和從1乘到這個數是對稱的,所以就是用一個check方法求x和y從1乘到該數的最小步數,加起來即可。

對于check方法,這里按k從大到小乘的貪心思路是不對的,正解是bfs展開路徑。觀察可以發現,在從1乘到該數的過程中,每一步的結果都必然是該數的因數,那么就可以先把該數的所有因數抓出來,接著用兩個set分別存當前步數里能乘出來的結果和下一步能乘出來的結果。然后每次遍歷當前層,若該數的因數沒有大于k,就讓該數的因數乘以當前層里的結果,然后存到下一層里。最后去找當前層里是否存在該數,有的話直接返回當前的步數,否則就讓cur來到下一層。

G. Build an Array

G題飯老師的講解沒聽懂……

總結

努力總會有回報!!加油!!再接再厲!!

END

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

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

相關文章

第九天:java注解

注解 1 什么是注解&#xff08;Annotation&#xff09; public class Test01 extends Object{//Override重寫的注解Overridepublic String toString() {return "Test01{}";} }2 內置注解 2.1 Override Override重寫的注解 Override public String toString() {ret…

【論文解讀】Deformable DETR | Deformable Transformers for End-to-End Object Detection

論文地址&#xff1a;https://arxiv.org/pdf/2010.04159 代碼地址&#xff1a;https://github.com/fundamentalvision/Deformable-DETR 摘要 DETR最近被提出&#xff0c;旨在消除物體檢測中許多手工設計的組件的需求&#xff0c;同時展示出良好的性能。然而&#xff0c;由于T…

從0到1上手Trae:開啟AI編程新時代

摘要&#xff1a;字節跳動 2025 年 1 月 19 日發布的 Trae 是一款 AI 原生集成開發環境工具&#xff0c;3 月 3 日國內版推出。它具備 AI 問答、代碼自動補全、基于 Agent 編程等功能&#xff0c;能自動化開發任務&#xff0c;實現端到端開發。核心功能包括智能代碼生成與補全、…

Vue項目打包常見問題

vue的前端項目中&#xff0c;有時候需要多個不同項目合并到一起。有時候有一些特殊要求。 1、打包后不允許生成帶 .map的文件 正常使用npm run build命令打包生成的dist文件中&#xff0c;js文件總會生成一個同名的.map文件&#xff0c;原因如下&#xff1a; ?總結?&#xf…

Linux 學習-模擬實現【簡易版bash】

1、bash本質 在模擬實現前&#xff0c;先得了解 bash 的本質 bash 也是一個進程&#xff0c;并且是不斷運行中的進程 證明&#xff1a;常顯示的命令輸入提示符就是 bash 不斷打印輸出的結果 輸入指令后&#xff0c;bash 會創建子進程&#xff0c;并進行程序替換 證明&#x…

GitHub 趨勢日報 (2025年05月31日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 1153 prompt-eng-interactive-tutorial 509 BillionMail 435 ai-agents-for-begin…

“人單酬“理念:財稅行業的自我驅動革命

引言&#xff1a;當薪酬不再是"固定數字"&#xff0c;而是"成長標尺" "為什么有人拼命工作卻收入停滯&#xff1f;為什么企業總在人才流失中掙扎&#xff1f;"這些問題背后&#xff0c;往往隱藏著傳統薪酬體系的僵化。而"人單酬"&…

AI大模型賦能,aPaaS+iPaaS構建新一代數智化應用|愛分析報告

01 aPaaS和iPaaS成為企業用戶關注重點 PaaS市場定義 根據Gartner的定義&#xff0c;PaaS&#xff08;Platform as a Service&#xff09;平臺是應用基礎架構&#xff08;中間件&#xff09;服務的廣泛集合&#xff0c; 包含應用平臺、集成、業務流程管理、數據服務和AI應用等…

WPS快速排版

論文包括&#xff08;按順序&#xff09;&#xff1a;封面&#xff08;含題目&#xff09;、摘 要、關鍵詞、Abstract&#xff08;英文摘要&#xff09;、Keywords、目錄、正文、參考文獻、在讀期間發表的學術論文及研究成果&#xff0c;致 謝 題目&#xff08;黑小一加粗&…

python第39天打卡

1.灰度圖像 作為圖像數據&#xff0c;相較于結構化數據&#xff08;表格數據&#xff09;他的特點在于他每個樣本的的形狀并不是(特征數&#xff0c;)&#xff0c;而是(寬&#xff0c;高&#xff0c;通道數) # 先繼續之前的代碼 import torch import torch.nn as nn import t…

win11小組件功能缺失的恢復方法

問題說明&#xff1a;重置了win11系統&#xff0c;結果小組件功能找不到了&#xff0c;最后用以下辦法解決。 1. 以管理員身份打開 PowerShell 或 CMD。 2. 運行以下命令&#xff1a; winget install 9MSSGKG348SP 注&#xff1a;如果報錯&#xff0c;可嘗試先卸載再安裝…

Kali Linux從入門到實戰:系統詳解與工具指南

一、Kali Linux簡介 Kali Linux是一款基于Debian的Linux發行版&#xff0c;專為滲透測試和網絡安全審計設計&#xff0c;由Offensive Security團隊維護。其前身是BackTrack&#xff0c;目前集成了超過600款安全工具&#xff0c;覆蓋滲透測試全流程&#xff0c;是網絡安全領域…

C語言 — 文件

目錄 1.流1.1 流的概念1.2 常見的的流 2.文件的打開和關閉2.1 fopen函數2.2 fclose函數2.3 文件的打開和關閉 3.文件的輸入輸出函數3.1 fputc函數3.2 fgetc函數3.3 feof函數和ferror函數3.4 fputs函數3.5 fgets函數3.6 fwrite函數3.7 fread函數3.8 fprintf函數3.9 fscanf函數 4…

Pull Request Integration 拉取請求集成

今天我想要把我創建的項目&#xff0c;通過修改yaml里面的內容&#xff0c;讓我在main分支下的其他分支拉取請求的時候自動化測試拉取的內容&#xff0c;以及將測試結果上傳到控制臺云端。 首先我通過修改yaml文件里面的內容 name: Build and Teston:push:branches:- mainjobs:…

NodeJS全棧開發面試題講解——P3數據庫(MySQL / MongoDB / Redis)

3.1 如何用 Node.js 連接 MySQL&#xff1f;你用過哪些 ORM&#xff1f; 面試官您好&#xff0c;我先介紹如何用 Node.js 連接 MySQL&#xff0c;然后補充我常用的 ORM 工具。 &#x1f50c; 原生連接 MySQL 使用 mysql2 模塊&#xff1a; npm install mysql2 const mysql …

Redis最佳實踐——性能優化技巧之數據結構選擇

Redis在電商應用中的數據結構選擇與性能優化技巧 一、電商核心場景與數據結構選型矩陣 應用場景推薦數據結構內存占用讀寫復雜度典型操作商品詳情緩存Hash低O(1)HGETALL, HMSET購物車管理Hash中O(1)HINCRBY, HDEL用戶會話管理Hash低O(1)HSETEX, HGET商品分類目錄Sorted Set高O…

題單:最大公約數(輾轉相除法)

題目描述 所謂 “最大公約數&#xff08;GCD&#xff09;” &#xff0c;是指所有公約數中最大的那個&#xff0c;例如 12 和 1818 的公約數有 1,2,3,6 &#xff0c;所以 12 和 18 的最大公約數為 6 。 輾轉相除法&#xff0c;又名歐幾里德算法&#xff08;Euclidean Algorit…

hadoop完整安裝教程(附帶jdk1.8+vim+ssh安裝)

本篇帶領大家在uabntu20虛擬機上安裝hadoop&#xff0c;其中還包括jdk1.8、ssh、vim的安裝教程&#xff0c;&#xff08;可能是&#xff09;史上最全的安裝教程&#xff01;&#xff01;&#xff01;若有疑問可以在評論區或者私信作者。建議在虛擬機上觀看此博客&#xff0c;便…

Flutter、React Native、Unity 下的 iOS 性能與調試實踐:兼容性挑戰與應對策略(含 KeyMob 工具經驗)

移動端跨平臺開發逐漸成為常態&#xff0c;Flutter、React Native、Unity、Hybrid App 等框架在各類 iOS 項目中頻繁出現。但隨之而來的&#xff0c;是一系列在 iOS 設備上調試難、性能數據采集難、日志整合難的問題。 今天這篇文章&#xff0c;我從實際項目出發&#xff0c;聊…

PyCharm接入DeepSeek,實現高效AI編程

介紹本土AI工具DeepSeek如何結合PyCharm同樣實現該功能。 一 DeepSeek API申請 首先進入DeepSeek官網&#xff1a;DeepSeek 官網 接著點擊右上角的 “API 開放平臺“ 然后點擊API keys 創建好的API key&#xff0c;記得復制保存好 二 pycharm 接入deepseek 首先打開PyCh…