Codeforces Round #494 (Div. 3)未完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #494 (Div. 3)未完结相关的知识,希望对你有一定的参考价值。
2022.3.4
题目地址:https://codeforces.com/contest/1003
目录
- A. Polycarp's Pockets【模拟】
- B. Binary String Constructing【构造】
- C. Intense Heat【前缀和】
- D. Coins and Queries【贪心】
- E. Tree Constructing【构造树】
- F. Abbreviation【DP 未完成】
A. Polycarp’s Pockets【模拟】
按照题意模拟即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
set<int>st[N];
int k,n;
int main(void)
cin>>n;
for(int i=0;i<n;i++)
int x; cin>>x;
bool flag=0;
for(int j=0;j<=k;j++)
if(st[j].find(x)==st[j].end())
st[j].insert(x);
flag=1;
break;
if(!flag) st[++k].insert(x);
cout<<k+1<<endl;
return 0;
B. Binary String Constructing【构造】
你会发现01010101
这种串是 2*4-1
种 010101
这种串是 2*3-1
种
即我们可以先输出一连串的01
,或者一连串的10
这个是根据0多还是1多。
#include<bits/stdc++.h>
using namespace std;
int a,b,x;
int main(void)
cin>>a>>b>>x;
char c1,c2;
if(a>b) c1='0',c2='1';//0多 01
else c1='1',c2='0',swap(a,b);//1多 10
for(int i=1;i<=x/2;i++) cout<<c1<<c2,a--,b--;
//前面我们已经输出了奇数个
if(x%2) //说明剩余的还有偶数个
while(a) cout<<c1,a--;
while(b) cout<<c2,b--;
else //说明剩余的是奇数个
while(b) cout<<c2,b--;
while(a) cout<<c1,a--;
return 0;
C. Intense Heat【前缀和】
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
double a[N],s[N],n,k;
int main(void)
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
double ans=-1e9;
for(int i=k;i<=n;i++)
for(int j=1;j+k-1<=n;j++)
double temp=(s[j+i-1]-s[j-1])/i;
if(temp>ans) ans=temp;
printf("%.15lf",ans);
return 0;
D. Coins and Queries【贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
map<int,int>mp;
int n,m;
int main(void)
cin>>n>>m;
for(int i=1;i<=n;i++)
int x; cin>>x;
mp[x]++;
while(m--)
int x; cin>>x;
int sum=0,cnt=0;
for(int i=30;i>=0;i--)
int u=1<<i;
if(mp[u]&&sum+u<=x)
int t=min(mp[u],(x-sum)/u);//尽可能的多拿
cnt+=t;
sum=sum+t*u;
if(sum==x) break;
if(sum==x) cout<<cnt<<endl;
else puts("-1");
return 0;
E. Tree Constructing【构造树】
先弄好直径,然后除了边界点,中间加入满足条件的树。
#include<bits/stdc++.h>
using namespace std;
int n,d,k,id;//d直径 k度数
vector<pair<int,int>>ve;
void dfs(int u,int dep,int maxd)
if(dep==maxd) return;
for(int i=0;i<k-1-(dep==0) && id<n;i++)
//dep==0说明是直径上的根节点有俩度
ve.push_back(u,++id);
dfs(id,dep+1,maxd);
int main(void)
cin>>n>>d>>k;
if((n <= d) || (d > 1 && k < 2))最基本的条件都不满足
cout << "NO" << endl;
return 0;
for(int i=1;i<=d;i++) ve.push_back(i,i+1);
id=d+1;
for(int i=2;i<=d;i++) dfs(i,0,min(i-1,d-(i-1)));//可以加的最大的深度
if(id<n) puts("NO");//说有的点不能全部加入
else
puts("YES");
for(int i=0;i<ve.size();i++) cout<<ve[i].first<<" "<<ve[i].second<<endl;
return 0;
F. Abbreviation【DP 未完成】
以上是关于Codeforces Round #494 (Div. 3)未完结的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #494 (Div. 3)爆炸记
Codeforces Round #494 (Div. 3) F. Abbreviation
Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)