Codeforces Round 565 (Div. 3)

传送门:Dashboard - Codeforces Round 565 (Div. 3) - Codeforces

A. Divide it!

#include<bits/stdc++.h>
#define int long long
using namespace std;
//思路:思维题
int N=2e5+1,mod=1e9+7;
int inf=1e9,INF=1e18;
void solve(){
    int n;
    cin>>n;
    int a=0,b=0,c=0;
    while(n%2==0)a++,n/=2;
    while(n%3==0)b++,n/=3;
    while(n%5==0)c++,n/=5;
    if(n==1){
        cout<<(a+b*2+c*3)<<"\n";
    }else{
        cout<<-1<<"\n";
    }
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t=1;
	cin>>t;
	while(t--)solve();
	cout.flush(),system("pause");
	return 0;
} 

B. Merge it!

#include<bits/stdc++.h>
#define int long long
using namespace std;
//思路:思维题
int N=2e5+1,mod=1e9+7;
int inf=1e9,INF=1e18;
void solve(){
    int n;
    cin>>n;
    vector<int> cnt(3);
    for(int i=0,a;i<n;i++){
        cin>>a,cnt[a%3]++;
    }
    if(cnt[1]<cnt[2]){
        cout<<(cnt[0]+cnt[1]+(cnt[2]-cnt[1])/3)<<"\n";
    }else{
        cout<<(cnt[0]+cnt[2]+(cnt[1]-cnt[2])/3)<<"\n";
    }
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t=1;
	cin>>t;
	while(t--)solve();
	cout.flush(),system("pause");
	return 0;
} 

C. Lose it!

#include<bits/stdc++.h>
#define int long long
using namespace std;
//思路:思维+构造
int N=2e5+1,mod=1e9+7;
int inf=1e9,INF=1e18;
void solve(){
    int n;
    cin>>n;
    vector<int> arr(n),index(100);
    for(int& c:arr)cin>>c;
    index[4]=0,index[8]=1,index[15]=2;
    index[16]=3,index[23]=4,index[42]=5;
    vector<int> cnt(6);
    for(int i=0;i<n;i++){
        int cur=index[arr[i]];
        if(cur==0){
            cnt[cur]++;
        }else if(cnt[cur-1]>0){
            cnt[cur-1]--,cnt[cur]++;
        }
    }
    cout<<n-cnt[5]*6<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t=1;
	//cin>>t;
	while(t--)solve();
	cout.flush(),system("pause");
	return 0;
} 

D. Recover it!

#include<bits/stdc++.h>
#define int long long
using namespace std;
//思路:思维+质数筛+贪心
//vis[i]表示i的最大公约数,pri[i]表示第i个质数
//1、先从大到小遍历遇到非质数i并且i和vis[i]的词频
//都大于1就将词频都减一,并将i放入答案中
//2、再从小到大遍历,遇到i的词频大于0,一定是答案
//收集并将i和pri[i]的词频都减一
int N=2750131,mod=1e9+7;
int inf=1e9,INF=1e18;
void solve(){
    vector<int> pri(N+5),vis(N+5);
    int index=1;
    for(int i=2;i<=N;i++){
        if(!vis[i])pri[index++]=i;
        for(int j=1;pri[j]<=N/i;j++){
            vis[i*pri[j]]=max(vis[i*pri[j]],i);
            if(i%pri[j]==0)break;
        }
    }
    int n;cin>>n;
    vector<int> cnt(N+5),ans;
    for(int i=0,a;i<n*2;i++){
        cin>>a;
        cnt[a]++;
    }
    for(int i=N;i>=2;){
        if(vis[i]&&cnt[i]&&cnt[vis[i]]){
            ans.push_back(i);
            cnt[i]--,cnt[vis[i]]--;
        }else{
            i--;
        }
    }
    for(int i=2;i<=N;){
        if(!vis[i]&&cnt[i]){
            ans.push_back(i);
            cnt[i]--,cnt[pri[i]]--;
        }else{
            i++;
        }
    }
    for(int& c:ans)cout<<c<<" ";
    cout<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
    int t=1;
	//cin>>t;
	while(t--)solve();
	cout.flush(),system("pause");
	return 0;
} 

E. Cover it!

#include<bits/stdc++.h>
#define int long long
using namespace std;
//思路:bfs
//将奇数层的节点放入odd数组中,将偶数层的节点放入even
//数组中,最后输出节点个数少的数组中的元素即可
int N=2e5+5,mod=1e9+7;
int inf=1e9,INF=1e18;
vector<int> he(N),ne,to;
void add(int a,int b){
    ne.push_back(he[a]);
    to.push_back(b);
    he[a]=ne.size()-1;
}
void solve(){
    int n,m;cin>>n>>m;
    he.assign(n+1,-1),ne.clear(),to.clear();
    for(int i=0,a,b;i<m;i++){
        cin>>a>>b;
        add(a,b),add(b,a);
    }
    vector<int> odd,even,vis(n+1);
    queue<array<int,2>> q;
    q.push({1,0});
    vis[1]=1;
    while(!q.empty()){
        auto c=q.front();q.pop();
        int cur=c[0],v=c[1];
        if(v&1)odd.push_back(cur);
        else even.push_back(cur);
        for(int i=he[cur];~i;i=ne[i]){
            if(!vis[to[i]]){
                vis[to[i]]=1;
                q.push({to[i],v+1});
            }
        }
    }
    if(even.size()<odd.size()){
        cout<<even.size()<<"\n";
        for(int& c:even)cout<<c<<" ";
        cout<<"\n";
    }else{
        cout<<odd.size()<<"\n";
        for(int& c:odd)cout<<c<<" ";
        cout<<"\n";
    }
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
    int t=1;
	cin>>t;
	while(t--)solve();
	cout.flush(),system("pause");
	return 0;
} 

F. Destroy it!

#include<bits/stdc++.h>
#define int long long
using namespace std;
//思路:贪心+记忆化搜索
//将每个回合是每种类型的牌从大到小排序每来到一个回合
//直接7种情况讨论即可
//1、什么也不拿直接跳到下一个回合
//2、拿1张1类型的牌
//3、拿2张1类型的牌
//4、拿3张1类型的牌
//5、拿1张2类型的牌
//6、拿1张3类型的牌
//7、拿1张1类型的牌和1张2类型的牌
const int N=2e5+5,mod=1e9+7;
const int inf=1e9,INF=1e18;
int n,dp[N][10];
int dfs(int i,int cnt,vector<array<vector<int>,3>>& arr){
    if(i==n){
        return 0;
    }else{
        if(dp[i][cnt]!=-1)return dp[i][cnt];
        int a=arr[i][0].size(),b=arr[i][1].size(),c=arr[i][2].size();
        int ans=dfs(i+1,cnt,arr);
        if(a>=1){
            int cur=(cnt>=9?arr[i][0][0]*2:arr[i][0][0]);
            ans=max(ans,dfs(i+1,(cnt+1)%10,arr)+cur);
        }
        if(a>=2){
            int cur=(cnt>=8?arr[i][0][0]*2:arr[i][0][0])+arr[i][0][1];
            ans=max(ans,dfs(i+1,(cnt+2)%10,arr)+cur);
        }
        if(a>=3){
            int cur=(cnt>=7?arr[i][0][0]*2:arr[i][0][0])+arr[i][0][1]+arr[i][0][2];
            ans=max(ans,dfs(i+1,(cnt+3)%10,arr)+cur);
        }
        if(b>=1){
            int cur=(cnt>=9?arr[i][1][0]*2:arr[i][1][0]);
            ans=max(ans,dfs(i+1,(cnt+1)%10,arr)+cur);
        }
        if(c>=1){
            int cur=(cnt>=9?arr[i][2][0]*2:arr[i][2][0]);
            ans=max(ans,dfs(i+1,(cnt+1)%10,arr)+cur);
        }
        if(a>=1&&b>=1){
            int mx=max(arr[i][0][0],arr[i][1][0]);
            int mn=min(arr[i][0][0],arr[i][1][0]);
            int cur=(cnt>=8?mx*2:mx)+mn;
            ans=max(ans,dfs(i+1,(cnt+2)%10,arr)+cur);
        }
        dp[i][cnt]=ans;
        return ans;
    }
}
void solve(){
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<10;j++){
            dp[i][j]=-1;
        }
    }
    vector<array<vector<int>,3>> arr(n);
    for(int i=0,m;i<n;i++){
        cin>>m;
        for(int j=0,a,b;j<m;j++){
            cin>>a>>b;
            arr[i][a-1].push_back(b);
        }
        for(int j=0;j<3;j++){
            sort(arr[i][j].begin(),arr[i][j].end(),greater<int>());
        }
    }
    cout<<dfs(0,0,arr)<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
    int t=1;
	//cin>>t;
	while(t--)solve();
	cout.flush(),system("pause");
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值