传送门: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;
}