【算法科目】2024年第二屆全國大學生信息技術認證挑戰賽 題解

圖像壓縮

曾經看到過,這是一道洛谷原題,很可惜我沒做過,有點看不懂就沒嘗試。

原題鏈接:B3851 [GESP202306 四級] 圖像壓縮 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)

因數分解

直接枚舉就行了,從2開始找因子,到sqrt(n),從小到大能被除的話一定是素數。

假設a<b<c,且a和c是素數因子,b是合數因子。

由于合數可以由素數因子相乘得到:那么b=d+e,且d和e均小于等于sqrt(b),故從2到sqrt(n)遍歷能除的除干凈之后,除出來的必然是素數。

對于大于sqrt(n)部分的因子,合數因子必然能分解成小于sqrt(n)的部分,除完之后還有剩下的,那么剩下的就為素數。

Q:有沒有可能剩下的素數有兩個。

A:兩個素數均大于sqrt(n),則乘積大于n,不合法。故最多一個。

最后考慮特殊情況,如果上面循環完了n還不為1,那么n就是素數。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){int n;cin>>n;map<int,int>f;int a=n;per(i,2,sqrt(n)){if(a%i==0){int cnt=0;while(a%i==0){a/=i;cnt++;}f[i]=cnt;}}if(a>1)f[a]++;auto it=f.rbegin();for(auto i:f){if(i.se==1){cout<<i.fr<<" ";}else{cout<<i.fr<<"^"<<i.se<<" ";}if(i!=*it){cout<<"* ";}}
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}

一個數可以分解數質數相乘。

更細化的,這些質數可以是偶數個或者奇數個。如 2 * 3 都只有一個,而 2^2*3,2有兩個。

所以我們可以把質數分成 數量為奇數的 和 數量為偶數的。

根據從小到大能除除干凈,除出來的是質數,我們可以先分離出數量為偶數的。

    per(i,2,sqrt(n)){int x=i*i;while(n%x==0)f[i]+=2,n/=x;}

假設一個平方質因子都沒分離出來,那么n=a*b*c*d a,b,c,d為素數且均為一個。

所以只需要2~sqrt(n)遍歷一次,大于sqrt(n)的只有一個,故如果n除完之后大于1,這就是那一個大于sqrt的數。

總復雜度sqrt(n)+sqrt(n),但是這樣可以分離出所有的單個因子,有需要的話可以提供更多思路。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){int n;cin>>n;map<int,int>f;per(i,2,sqrt(n)){int x=i*i;while(n%x==0)f[i]+=2,n/=x;}per(i,2,sqrt(n)){if(n%i==0){f[i]++;n/=i;}}if(n>1)f[n]++;auto it=f.rbegin();for(auto i:f){if(i.se>=2){cout<<i.fr<<"^"<<i.se<<" ";}else cout<<i.fr<<" ";if(i!=*it){cout<<"* ";}}
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}

探險

這道題應該才是簽到題。不過被榜單帶歪了都是先做的 因數分解求和。

可以肯定的是,小理一定在某個洞穴停下,剩下的次數全部用來反復進入前面進入過的洞穴,且反復進入的洞穴一定是同一個,經驗值最大的那一個。

那么只需要枚舉所有情況就可以了。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){int n,k;cin>>n>>k;vector<int> a(n+1),b(n+1);per(i,1,n)cin>>a[i];per(i,1,n)cin>>b[i];int f=0,res=0,ans=0;per(i,1,min(n,k)){int leave=k-i;//剩下的次數f+=a[i];//開洞穴累計的經驗值res=max(res,b[i]);//前面開過的洞穴最大的那一個ans=max(ans,leave*res+f);//累計答案}cout<<ans<<endl;
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

最小乘積

這道題顯然官方數據集弄錯了,導致一個人都沒有通過。

可以進行的操作:

1、ai<0 可以將 ai 替換成 [ai,0] 其中的一個。

2、ai>=0 可以將 ai 替換成 [0,ai] 其中的一個。(顯然 0 不能做修改)

要求進行最少的操作,使得數組的乘積最小。

只需要記錄一下正數,負數,0,的數量即可。

如果存在 0,顯然不管怎么操作最后乘積都是0,則不需要操作。

如果不存在 0,若?負數 有奇數個,那么最終乘積為負數,不需要修改。

? ? ? ? ? ? ? ? ? ? ? ? ?若 負數 有偶數個,那么乘積一定正數,任意一個改成0。

無人AC。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){int n;cin>>n;int pos=0,neg=0,zero=0;per(i,1,n){int tmp;cin>>tmp;if(tmp>0)pos++;else if(tmp<0)neg++;else if(tmp==0)zero++;}if(zero){cout<<0<<endl;}else{if(neg%2==0){cout<<1<<endl;cout<<1<<" "<<0<<endl;}else{cout<<0<<endl;}}
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;cin>>t;while(t--)solve();return 0;
}

若此非正解請在評論區留言,否則建議大伙避雷該比賽,且本次全國賽算法科目只有120個左右參加,好少的人。

求和

一道哈人的模擬題。

思路比較簡單,就是數字全部提取出來加在一起。

需要注意的是負號-,有可能作為分隔符使用。

如2-3,輸出的是2+3=5

而2--3,輸出的是2-3=-1

那么作為分割符的條件就很明顯了,前面不能是數字。

由于輸入沒有告知多少行,且中間可能存在空行,所以我們使用getline來讀入。

string s;
while(getline(cin,s))

本地調試的時候如果沒有結果,請按下Ctrl+D,相當于輸入文件末尾的EOF。

#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define fr first
#define se second
#define endl '\n'
using namespace std;void solve(){string s;while(getline(cin,s)){int res=0,ans=0;bool havNum=false;int pos=1;//是否是正數if(s.empty())continue;//什么都沒有輸入直接跳過per(i,0,s.length()-1){if(s[i]>='0' and s[i]<='9'){havNum=true;res*=10;res+=s[i]-'0';}else if(s[i]=='-' and s[i+1]>='0' and s[i+1]<='9' and !(s[i-1]>='0' and s[i-1]<='9')){pos=-1;}else{
//                debug(res*pos);ans+=res*pos;pos=true;res=0;}}if(res)ans+=res*pos;//考慮最后結尾是數字,沒有累加上的情況。if(havNum)cout<<ans<<endl;//字符串中至少有一個整數才能輸出。}
}signed main(){ios::sync_with_stdio(false),cin.tie(nullptr);int t=1;while(t--)solve();return 0;
}

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

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

相關文章

Spring:EnclosingClass工具類分辨

Spring&#xff1a;EnclosingClass工具類分辨 1 前言 通過Spring的工具分辨EnclosingClass類。 測試類如下&#xff1a; package com.xiaoxu.test.enclosingClass;/*** author xiaoxu* date 2024-01-18* java_demo2:com.xiaoxu.test.enclosingClass.Outter*/ public class …

微信小程序(四十六)登入界面-進階版

注釋很詳細&#xff0c;直接上代碼 上一篇 此文使用了vant組件庫&#xff0c;沒有安裝配置的可以參考此篇vant組件的安裝與配置 新增內容&#xff1a; 1.手機號與驗證碼格式驗證 2.驗證碼的網絡申請和校驗 wechat-http模塊在好幾篇以前已經講了咋安裝的&#xff0c;不記得的友…

為什么要用Python?

為什么要用Python&#xff1f; Python簡單易用&#xff1a;提供大量的簡單易用數據結構和內置庫&#xff0c;語法結構也很簡單易讀&#xff0c;不需要使用括號來進行代碼塊分組&#xff0c;也不需要預聲明變量或參數。Python開發效率高&#xff1a;簡單易用的前提下&#xff0…

vue3輸入單號和張數,自動生成連號的單號

需求&#xff1a; 輸入連號事件&#xff0c;需要在表格中輸入物流單號&#xff0c;物流號碼&#xff0c;生成的數量&#xff0c;名稱&#xff0c;點擊確定自動生成固定數量的連號物流單號 1.頁面布局 <div><el-button type"primary" size"default&quo…

最新版阿里云Linux CentOS7 ecs-user用戶安裝Mysql8詳細教程(超簡單)

經過兩天的踩坑后&#xff0c;終于成功安裝&#xff0c;并找到了最快捷的安裝方式。接下來就由我來給大家介紹不踩坑安裝大法&#xff01; 一、下載Mysql 首先前往Mysql官網下載 MySQL官方下載地址 第一步&#xff0c;選擇安裝包&#xff0c;這是最關鍵的一步&#xff0c;選錯安…

使用query請求數據出現500的報錯

我在寫項目的時候遇到了一個問題&#xff0c;就是在存商品id的時候我將它使用了JSON.stringify的格式轉換了&#xff01;&#xff01;&#xff01;于是便爆出了500這個錯誤&#xff01;&#xff01;&#xff01; 我將JSON.stringify的格式去除之后&#xff0c;它就正常顯示了&…

昇騰ACL應用開發之硬件編解碼dvpp

1.前言 在我們進行實際的應用開發時&#xff0c;都會隨著對一款產品或者AI芯片的了解加深&#xff0c;大家都會想到有什么可以加速預處理啊或者后處理的手段&#xff1f;常見的不同廠家對于應用開發的時候&#xff0c;都會提供一個硬件解碼和硬件編碼的能力&#xff0c;這也是拋…

Docker 命令詳解:容器、鏡像、網絡和數據卷管理

文章目錄 1. docker run2. docker pull3. docker images4. docker ps5. docker stop6. docker rm7. docker commit8. docker exec9. docker logs10. docker network11. docker volume12. docker save13. docker load14. docker tag15. docker search16. docker diff17. docker …

sql注入之sqli-labs/less-3 單引號加括號閉合

輸入單引號試探&#xff1a; id1 報錯信息里面出現 ) 說明閉合符合里面還有個 ) 再次試探&#xff1a;id1 ) order by 3 -- 查看回顯位置&#xff1a; id-1%20%27)%20union%20select%201,2,3%20-- 查看數據庫&#xff1a; id-1%20%27)%20union%20select%201,2,database()%2…

Kerberos協議攻防之黃金票據控制整個公司電腦

&#x1f449;重點內容&#xff1a; 1、網絡認證、本地認證、域認證的優略勢 2、域認證之Kerberos協議的認證流程詳解 3、TGT、Krbtgt、KDC、TGS搞懂這些繞口的概念 4、深入理解黃金票據攻擊Golden Ticket Attack 5、實戰&#xff01;通過黃金票據控制內網中所有的電腦

DC-2靶機詳解

寫寫自己打DC-2的過程 使用工具 kali DC-2的靶機下載地址為&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 環境配置。 Kali和DC-2都設置為NAT模式&#xff0c;都為僅主機模式也可以。 信息收集 arp-scan -l nmap -sn 192.168.236.0/24 獲取靶機ip&#xff1a;192.16…

基于springboot+vue的工廠車間管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

【Linux】輸入系統應用

# 前置知識 (1)輸入子系統分為三層&#xff0c;分別是事件處理層、核心層、設備驅動層&#xff1b; (2)鼠標移動、鍵盤按鍵按下等輸入事件都需要通過設備驅動層→核心層→事件處理層→用戶空間&#xff0c;層層上報&#xff0c;直到應用程序; 事件處理層 (1)事情處理層主要是負…

【八】【SQL】子查詢和where

顯示與SMITH同一部門的員工 mysql> select *from emp where enameSMITH; ----------------------------------------------------------------------- | empno | ename | job | mgr | hiredate | sal | comm | deptno | --------------------------------…

Python調用C,python call c,pybind11

文章目錄 前言1.將pybind11 clone至當前項目下的extern目錄下2.在CmakeLists.txt中將pybind11項目包含3.接口cpp文件格式4.編譯5.導入Python使用6.性能比較pybind11項目地址 前言 通過https://github.com/pybind/pybind11項目實現Python調用C/C代碼 實現步驟 1.將pybind11 cl…

騰訊云4核8G服務器申請費用多少?性能如何?支持幾個人?

騰訊云4核8G服務器支持多少人在線訪問&#xff1f;支持25人同時訪問。實際上程序效率不同支持人數在線人數不同&#xff0c;公網帶寬也是影響4核8G服務器并發數的一大因素&#xff0c;假設公網帶寬太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU內存也會造成計算…

大數據報告檢測到風險等級太高是怎么回事呢?

隨著金融風控越來越多元化&#xff0c;大數據作為新興的技術被運用到貸前風控中去了&#xff0c;不少人也了解過自己的大數據&#xff0c;但是由于相關知識不足&#xff0c;看不懂報告&#xff0c;在常見的問題中&#xff0c;大數據檢測到風險等級太高是怎么回事呢?小易大數據…

《javascript高級程序設計》學習筆記 | 21.2.錯誤處理

關注[前端小謳]&#xff0c;閱讀更多原創技術文章 錯誤處理 相關代碼 → try/catch 語句 ES3 新增了try/catch語句&#xff0c;基本語法與 Java 中的 try/catch 一樣 try {// 可能出錯的代碼const a 3;a 4; } catch (error) {// 出錯時執行的代碼console.log("An er…

vsomeip源碼剖析--00環境搭建

環境 Win11 WSL2 Ubuntu22.04安裝依賴 sudo apt-get install cmake sudo apt-get install libboost-system1.71-dev libboost-thread1.71-dev libboost-log1.71-dev源碼編譯 獲取源碼 https://github.com/COVESA/vsomeip.git編譯 cd vsomeip mkdir build cd build// 一般…

漫漫數學之旅035

文章目錄 經典格言數學習題古今評注名人小傳 - 黎勒?笛卡爾 經典格言 完美的數和完美的人是同樣罕見的。——黎勒?笛卡爾&#xff08;Ren Descrates&#xff09; 完美的數和完美的人都是極為罕見的。這句話表達了一個哲學觀點&#xff0c;即無論是在數學領域還是人類自身&am…