(6/6) Codeforces Round #694 (Div. 2)
(6/6) Codeforces Round #694 (Div. 2)
A. Strange Partition
題意:
給一個(gè)數(shù)組,數(shù)組中的所有元素可以任意合并,求數(shù)組的每個(gè)元素除以x上去整的和,求結(jié)果的最大值和最小值。
思路:
瞎猜。最小值肯定是都合并在一起,最大值是分開。
代碼:
#include <bits/stdc++.h> #define int long long using namespace std; int a[100010];void work() {int n, x;cin >> n >> x;int s1 = 0, s2 = 0;for (int i = 1; i <= n; i++) {cin >> a[i];s1 += a[i];s2 += (a[i] + x - 1) / x;}cout << (s1 + x - 1) / x << " " << s2 << endl; }int32_t main() {ios::sync_with_stdio(false);cin.tie(0);int cas;cin >> cas;while (cas--) work();return 0; }B. Strange List
題意:
給你一數(shù)組,一個(gè)x,從前往后遍歷數(shù)組(也會(huì)遍歷后面加進(jìn)來的元素),如果當(dāng)前元素a可以被x除盡,則在數(shù)組末尾加上x個(gè)a/x。如果不能被除盡則停止,問數(shù)組的元素之和。
思路:
可以很顯然看出一個(gè)性質(zhì)如果a/x也能被x除盡,那么結(jié)果增加a,因?yàn)橐还灿衳個(gè)a/x。
模擬,如果能除盡,則結(jié)果加上當(dāng)前元素,不能除盡則跳出。
代碼:
#include <bits/stdc++.h> #define int long long using namespace std; int a[100010]; int b[100010];void work() {int n, x, s = 0;cin >> n >> x;for (int i = 0; i < n; i++) {cin >> a[i];b[i] = a[i];s += a[i];}for (int i = 0; i < n; i = (i + 1) % n) {if (b[i] % x == 0) s += a[i], b[i] = b[i] / x;else break;}cout << s << endl; }int32_t main() {ios::sync_with_stdio(false);cin.tie(0);int cas;cin >> cas;while (cas--) work();return 0; }C. Strange Birthday Party
題意:
商品按價(jià)錢從小到大排序,每個(gè)商品只能拿1次。
n個(gè)客人,每個(gè)客人有一個(gè)權(quán)值,只能拿下標(biāo)比權(quán)值小的商品或者給客人下標(biāo)為權(quán)值的商品對(duì)應(yīng)的現(xiàn)金。
思路:
排序貪心,權(quán)值大的先拿前面的,序號(hào)小的后拿,如果不存在了,就拿現(xiàn)金。
代碼:
#include <bits/stdc++.h> #define int long long using namespace std; #define int long long constexpr int N = 300010; int k[N],c[N],vis[N];void work() {int n,m;cin>>n>>m;for(int i=1;i<=n;i++) cin>>k[i];for(int i=1;i<=m;i++) vis[i] = 0;for(int i=1;i<=m;i++) cin>>c[i];sort(k+1,k+1+n);int ans = 0;int j = 1;for(int i=n;i>=1;i--){if(c[k[i]]>c[j] && !vis[j] && j<=m){ans+=c[j];vis[j] = 1;j++;}else{ans+=c[k[i]];}}cout<<ans<<endl; }int32_t main() {ios::sync_with_stdio(false);cin.tie(0);int T;cin>>T;while(T--) work();return 0; }D. Strange Definition
題意:
如果lcm(x,y)/gcd(x,y)lcm(x,y)/gcd(x,y)lcm(x,y)/gcd(x,y)為一個(gè)完全平方數(shù),那么x和y相鄰。給你一個(gè)數(shù)組,從0秒開始,每秒鐘每個(gè)元素都會(huì)被其和與其互為完全平方數(shù)的乘積替換,設(shè)did_idi?為數(shù)組中第i個(gè)元素共有幾個(gè)互為完全平方數(shù)的數(shù)(包含本身)。
q個(gè)詢問,每個(gè)詢問詢問第i秒時(shí)d的最大值。
思路:
有一個(gè)明顯的推理:x*y如果是完全平方數(shù),那么x和y相鄰。
那么我們把所有元素的偶數(shù)質(zhì)因子都篩掉,設(shè)為core數(shù)組,那么如果core[x]=core[y],那么x和y相鄰。
當(dāng)詢問為0,我們只需要輸出出現(xiàn)次數(shù)最多的core。
當(dāng)詢問不為0,比如為1,那么core出現(xiàn)為偶數(shù)次的下次都會(huì)為1,如果出現(xiàn)奇數(shù)次下次不變,特例當(dāng)core為1時(shí)無論奇偶都不變。所以重新統(tǒng)計(jì)。
當(dāng)詢問大于1,我們可以推一下,結(jié)果與1相同。
代碼:
#include <bits/stdc++.h> using namespace std; #define int long long int primes[1001000];void work() {unordered_map<int, int> haxh;int n;cin >> n;haxh[1] = 0;for (int i = 1; i <= n; i++) {int h = 1, x;cin >> x;while (primes[x] != 1) {int t = 0;int j = primes[x];while (x % j == 0) {x /= j;t++;}if (t % 2) h *= j;}haxh[h]++;}int cnt1 = 0, cnt2 = 0;for (auto i : haxh) cnt1 = max(cnt1, i.second);for (auto &i : haxh) if (i.first != 1 && i.second % 2 == 0) {haxh[1] += i.second;i.second = 0;}for (auto i : haxh) cnt2 = max(cnt2, i.second);int q;cin >> q;while (q--) {int x;cin >> x;if (x == 0) cout << cnt1 << endl;else cout << cnt2 << endl;} }int32_t main() {ios::sync_with_stdio(false);cin.tie(nullptr);primes[1] = 1;for (int i = 2; i <= 1000100; i++) {if (!primes[i]) {primes[i] = i;for (int j = i * 2; j <= 1000100; j += i) if (!primes[j]) primes[j] = i;}}int cas;cin >> cas;while (cas--) work(); }E. Strange Shuffle
題意:
交互題,一組人圍成一圈,每個(gè)人都會(huì)把當(dāng)前元素/2下取整給左側(cè)的人,當(dāng)前元素/2上取整給右側(cè)的人。
每秒所有人同時(shí)執(zhí)行該操作一次。
有一個(gè)偽裝者,他會(huì)把所有的元素都給右側(cè),要求在1000秒內(nèi)找出偽裝者,每秒可以進(jìn)行一次詢問,詢問q位置的人的當(dāng)前元素。
思路:
打表看規(guī)律。n為15,p為5,下標(biāo)從1開始,k為50,第一行為初始狀態(tài)。
每多一秒,會(huì)多出現(xiàn)一個(gè)大于k的數(shù),sqrt(100000)=330sqrt(100000)=330sqrt(100000)=330,我們先用sqrt次,讓其出現(xiàn)sqrt個(gè)大于k的數(shù),我們可以發(fā)現(xiàn),答案位置永遠(yuǎn)為k,答案右側(cè)大于k,答案左側(cè)小于k。
所以我們找到一個(gè)大于k或者小于k的數(shù),然后左移或者右移到第一個(gè)等于k的數(shù),即為所求。
代碼:
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; #define x first #define y second #define bg begin() #define ed end() #define pb push_back #define mp make_pair #define sz(a) int((a).size()) #define R(i,n) for(int i(0);i<(n);++i) #define L(i,n) for(int i((n)-1);i>=0;--i) const int iinf=0x3f3f3f3f; const ll linf=0x3f3f3f3f3f3f3f3f;const int N=3e5; int n,m,a[N],b[N];int ask(int i){cout<<"? "<<i+1<<endl;int x; cin>>x; return x; }int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;const int B=sqrt(n)-1;R(i,B+1) ask(i);int p=0,x=ask(p);while(x==m) (p+=B)%=n,x=ask(p);if(x>m){ while(ask((p+n-B)%n)>m) (p+=n-B)%=n;while(ask((p+n-1)%n)>m) (p+=n-1)%=n;(p+=n-1)%=n;} else { while(ask((p+B)%n)<m) (p+=B)%=n;while(ask((p+1)%n)<m) (p+=1)%=n;++p%=n;}cout<<"! "<<p+1<<endl;return 0; }F. Strange Housing
題意:
給你節(jié)點(diǎn)和邊,染色,染色的住老師,未染色的住學(xué)生。
要求:相鄰的節(jié)點(diǎn)不能同時(shí)染色,只有染色的節(jié)點(diǎn)和不染色的節(jié)點(diǎn)相鄰的邊才成立,要求圖聯(lián)通。
思路:
暴力貪心即可。如果與當(dāng)前節(jié)點(diǎn)相鄰的所有節(jié)點(diǎn)沒老師,那當(dāng)前節(jié)點(diǎn)就放老師,否則不放。
如果有節(jié)點(diǎn)未遍歷到,則輸出NO。
證明:老師一定不相鄰,一定聯(lián)通,放學(xué)生時(shí)周圍一定有老師。
代碼:
#include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 300010; vector<int> g[maxn]; int cnt; int st[maxn];void dfs(int u) {int sum1 = 0, sum2 = 0;for (int i = 0; i < g[u].size(); i++) if (st[g[u][i]]) {if (st[g[u][i]] == 1) sum1++;else sum2++;// cout << st[g[u][i]] << endl;// cout << "---" << endl;}// cout << sum1 << endl;if (sum1 == 0) st[u] = 1;else st[u] = 2;for (int i = 0; i < g[u].size(); i++) if (!st[g[u][i]]) dfs(g[u][i]); }void work() {cnt = 0;int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) st[i] = 0, g[i].clear();while (m--) {int a, b;cin >> a >> b;g[a].push_back(b);g[b].push_back(a);}dfs(1);int cnt = 0, flag = 0;for (int i = 1; i <= n; i++) {if (st[i] == 1) cnt++;if (!st[i]) flag = 1;}if (flag) cout << "NO" << endl;else {cout << "YES" << endl;cout << cnt << endl;for (int i = 1; i <= n; i++)if (st[i] == 1) cout << i << " ";cout << endl;} }int32_t main() {int cas;cin >> cas;while (cas--) work(); }總結(jié)
以上是生活随笔為你收集整理的(6/6) Codeforces Round #694 (Div. 2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学计算机专业相关证书有哪些,大学必考8
- 下一篇: ps 颜色理论