A
签到。按照题意模拟输出就好了。
#include<bits/stdc++.h> using namespace std; string s="I LOVE WIT"; int main(){ int len=s.size(); for(int i=0;i<len;i++){ for(int j=0;j<i;j++) cout<<' '; cout<<s[i]<<endl; } return 0; }
B
签到。12 * 2.54 * 10=304.8 n是5的倍数结果就是整数 否则保留一位小数
#include<bits/stdc++.h> using namespace std; int main(){ int n;cin>>n; if(n%5==0) cout<<n/5*1524<<endl; else printf("%.1f",1.0*n*304.8); return 0; }
C
闪光率是1%,意味着非闪光率是99%。注意下这个就好
#include<bits/stdc++.h> using namespace std; int main(){ double a[36]={0}; for(int i=0;i<7;i++){ scanf("%lf%%",&a[i]); } int n,m;cin>>n>>m; double q=a[n]; if(m==1) q=q*0.01; else q*=0.99; printf("%.2f%%",q); return 0; }
D
位运算,我的做法是直接模拟过程了。
#include<bits/stdc++.h> using namespace std; int main(){ int a[36]={0}; long long n;cin>>n; int cnt=0; for(int i=0;i<=32;i++){ if(n>>i&1) cnt=i; } int m=0; for(int i=0;i<cnt;i++){ if(!(n>>i&1)) m+=1ll<<i; } n=0; for(int i=0;i<cnt;i++){ if(m>>i&1){ n+= 1ll<<(31-i); } } cout<<n; return 0; }
E
算出来到达时间,比较一下即可。
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; scanf("%d:%d:%d",&a,&b,&c); if(a>=21) cout<<"too late"<<endl; else{ c+=33; b+=c/60; c%=60; b+=22; a+=b/60; a+=1; b%=60; //cout<<a<<" "<<b<<" "<<c<<endl; if(a<19) cout<<"arrive on time"; else if(a<21) cout<<"arrive late"<<endl; else cout<<"too late"<<endl; } return 0; }
F
等于每个人获得的鸽子肉只能从一只上面来,不能拼凑。
题意等价把n个数字拆分m个相同数字出来,数字最大是多少,数字不能拼凑。
答案具有单调性。二分即可
#include<bits/stdc++.h> using namespace std; int a[1<<17]; int n,m; bool check(int x){ int num=0; for(int i=1;i<=n;i++){ num+=a[i]/x; } return num>=m; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; int l=0,r=2e9,mid; while(l+1<r){ mid=l+r>>1; if(check(mid)) l=mid; else r=mid; } cout<<l<<endl; return 0; }
G
显然总和是个等比数列,等比数列前n个项和求一下,和n比一下大小。
注意一下奇数是凑不出来的,结果炸int
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll k,n;cin>>k>>n; if((1ll<<(k+1))-2<n || n&1) cout<<"No"; else{ cout<<"Yes"<<endl; ll q=0; for(ll i=0;i<63;i++){ if(n>>i&1) q=i; } cout<<(1ll<<q); } return 0; }
I
dfs暴力搜,注意剪枝
#include<bits/stdc++.h> using namespace std; int n,w; int a[25],b[25]; int ans; void dfs(int x,int num){ if(num>=ans) return ; if(x>n) { ans=min(ans,num);return ; } for(int i=1;i<=num;i++){ if(a[x]+b[i]<=w){ b[i]+=a[x],dfs(x+1,num),b[i]-=a[x]; } } b[num+1]+=a[x]; dfs(x+1,num+1); b[num+1]-=a[x]; } int main(){ cin>>n>>w; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n,greater<int>()); ans=n; dfs(1,0); cout<<ans; return 0; }
J
就是模拟栈的过程,不用这个栈需要能访问栈内任意一个,所以不能用stl的栈,需要自己手写模拟一下。
#include<bits/stdc++.h> using namespace std; struct node{ int l,r; int id; }a[1<<20]; int ans[1<<20]; int vis[1<<20]; int sta[1<<20],tot=1; bool cmp(node x,node y){ return x.l<y.l; } char s[15]; int main(){ // ios::sync_with_stdio(0); int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); if(s[0]=='i') vis[i]=1; } int q;scanf("%d",&q); for(int i=1;i<=q;i++){ int x,y;scanf("%d%d",&x,&y); a[i]={x,y,i}; } sort(a+1,a+1+q,cmp); int k=0,num=1; for(int i=1;i<=q;i++){ while(a[i].l!=k){ if(vis[++k]) sta[tot++]=num++; else tot--; } ans[a[i].id]=sta[a[i].r]; } for(int i=1;i<=q;i++) printf("%d\n",ans[i]); return 0; }
K
数学推公式。
n行m列。
枚举k即可,n行选k个 m列选k个
然后等于是在一个k阶的矩阵里,在选择k个,并且每行每列只能有一个 所以方案数是k!
预处理阶乘即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll f[1<<21]; const ll mod=1e9+7; ll qpow(ll a,ll b){ ll ans=1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans; } int main(){ int n,m,k;cin>>n>>m>>k; f[0]=1; for(int i=1;i<=1000000;i++) f[i]=f[i-1]*i%mod; ll ans=0; k=min(k,min(n,m)); for(int i=1;i<=k;i++){ ans+=(f[n]*qpow(f[n-i]*f[i]%mod,mod-2))%mod*(f[m]*qpow(f[m-i]*f[i]%mod,mod-2)%mod)%mod*f[i]%mod; ans%=mod; } cout<<ans; return 0; }
L
这是一棵有根树,根据入度可以得到根节点。
亲缘关系就是树上两点的最近距离。
是否是直系血亲,计算两个人的lca是否是其中一个即可。
对于树上两点间的距离为 dis[x]+dis[y]-2 * dis[LCA(x,y)]
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 + 5; int head[N], tot, depth[N], fa[N][22], lg[N]; int du[N]; struct Node { int t, nex; } e[N << 1]; void add(int x, int y) { e[++tot].t = y; e[tot].nex = head[x]; head[x] = tot; } void dfs(int now, int fath) { fa[now][0] = fath; depth[now] = depth[fath] + 1; for (int i = 1; i <= lg[depth[now]]; ++i) fa[now][i] = fa[fa[now][i - 1]][i - 1]; for (int i = head[now]; i; i = e[i].nex) if (e[i].t != fath) dfs(e[i].t, now); } int LCA(int x, int y) { if (depth[x] < depth[y]) swap(x, y); while (depth[x] > depth[y]) x = fa[x][lg[depth[x] - depth[y]] - 1]; if (x == y) return x; for (int k = lg[depth[x]] - 1; k >= 0; --k) if (fa[x][k] != fa[y][k]) x = fa[x][k], y = fa[y][k]; return fa[x][0]; } void init() { tot = 0; memset(head, 0, sizeof(head)); memset(fa, 0, sizeof(fa)); memset(depth, 0, sizeof(depth)); } int main() { // ios::sync_with_stdio(false); int n, m, s; scanf("%d%d", &n, &m); int root; init(); for (int i = 1; i <= n - 1; ++i) { int x, y; scanf("%d%d", &x, &y); add(x, y); du[y]++; add(y,x); } for(int i=1; i<=n; i++) { if(!du[i]) { root=i; break; } } for (int i = 1; i <= n; ++i) lg[i] = lg[i - 1] + (1 << lg[i - 1] == i); dfs(root, root); for (int i = 1; i <= m; ++i) { int x, y, p, z, ans; scanf("%d%d", &x, &y); p = LCA(x, y ); ans= depth[x] + depth[y] - 2 * depth[p]; if (x==p || y==p || ans<=4) puts("NO"); else puts("YES"); cout<<ans<<endl; } return 0; }