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;
}