Codeforces Round #565 (Div. 3) A B C E
Codeforces Round #565 (Div. 3)
由题可知,分别消掉1个2,3,5分别需要1,2,3的花费
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll q,n; int main(){ cin>>q; while(q--){ cin>>n; ll cnt=0; ll p=-1; int flag=0; while(p<cnt){ p=cnt; if(n%2ll==0) { n=n/2ll; cnt++; } if(n%3==0){ n=n/3ll; cnt+=2ll; } if(n%5ll==0){ n=n/5ll; cnt+=3ll; } if(n==1) flag=1; } if(flag)cout<<cnt<<"\n"; else cout<<"-1\n"; } return 0; }
将ai=ai%3(1<=ai<=1e9),统计 0 1 2的个数,res=a[0]+(1+2的个数)+剩余的1的个数/3或者剩余2的个数/3
#include<bits/stdc++.h> using namespace std; typedef long long ll; int t,n,a[4]; int main(){ cin>>t; while(t--){ for(int i=0;i<=2;i++){ a[i]=0; } cin>>n; int c,res; for(int i=0;i<n;i++){ cin>>c; c=c%3; a[c]++; } if(a[1]>a[2]){ a[1]=a[1]-a[2]; res=a[2]; res=res+a[1]/3; }else{ res=a[1]; a[2]=a[2]-a[1]; res+=a[2]/3; } res=res+a[0]; cout<<res<<"\n"; } return 0; }
C Lose it!
4,8,15,16,23,42 分别记为 1 2 3 4 5 6
b[i]表示有b[i]个从1到i连续的序列
if b[i-1]>0 那么b[i]++,b[i-1]--;
最后得到b[6]个从1到6连续的序列
需要删除的数 n-b[6]*6
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6; int n; int a[N],p[50],b[10]={0}; int main(){ p[4]=1,p[8]=2,p[15]=3,p[16]=4,p[23]=5,p[42]=6; b[0]=N; cin>>n; int res=0; int c; for(int i=0;i<n;i++){ cin>>c; if(b[p[c]-1]>0) b[p[c]]++,b[p[c]-1]--; } res=n-b[6]*6; cout<<res<<"\n"; return 0; }
二分染色,dfs bfs 都行,选择点少的颜色输出
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+100; int t; int n,m; int vis[N]; int cnt[2]; struct Edge{ int to,next; }e[N*2]; int head[N],tot; void addEdge(int u,int v){ e[tot].to=v; e[tot].next=head[u]; head[u]=tot++; } int dfs(int u,int c){ vis[u]=c; cnt[c]++; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(vis[v]==-1){ dfs(v,c^1); } } } int main(){ std::ios::sync_with_stdio(false); cin>>t; while(t--){ cin>>n>>m; memset(head,-1,sizeof(int)*(n+100)); memset(vis,-1,sizeof(int)*(n+100)); tot=0; cnt[0]=0,cnt[1]=0; int u,v; for(int i=0;i<m;i++){ cin>>u>>v; addEdge(u,v); addEdge(v,u); } dfs(1,0); int c,d; if(cnt[0]>cnt[1]) c=1,d=cnt[1]; else c=0,d=cnt[0]; cout<<d<<"\n"; for(int i=1;i<=n;i++){ if(vis[i]==c) cout<<i<<" "; } cout<<"\n"; } return 0; }