CF1846

CF1846A

考虑每根绳子是否影响糖果落地 显然 若高度-绳子长度>0 绳子会拽着糖果不让它落地 ans++即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,a,b,ans;
signed main(){
    t=read();
    while(t--){
        n=read();ans=0;
        while(n--){
            a=read();b=read();
            if(a-b>0)ans++;
        }
        writel(ans);
    }
    return 0;
}

CF1846B

模拟。

可能是答案的有三行三列和两个对角线,分别判断即可。

记得把里面的"."判掉

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=1e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,vis[10];
char c[5][5];
signed main(){
    t=read();
    while(t--){
        int flag=0;
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=3;i++)
            scanf("%s",c[i]+1);
        for(int i=1;i<=3;i++){
            for(int j=1;j<=3;j++){
                if(c[i][j]=='.'){
                    vis[i]=vis[3+j]=1;
                    if(i==j)vis[7]=1;
                    if(i+j==4)vis[8]=1;
                }
            }
        }
        for(int i=1;i<=3;i++)
            if(!vis[i]&&c[i][1]==c[i][2]&&c[i][2]==c[i][3]){pc(c[i][1]);pc('\n');flag=1;break;}
        if(flag)continue;
        for(int i=1;i<=3;i++)
            if(!vis[i+3]&&c[1][i]==c[2][i]&&c[2][i]==c[3][i]){pc(c[1][i]);pc('\n');flag=1;break;}
        if(flag)continue;
        if(!vis[7]&&c[1][1]==c[2][2]&&c[2][2]==c[3][3]){pc(c[1][1]);pc('\n');continue;}
        if(!vis[8]&&c[1][3]==c[2][2]&&c[2][2]==c[3][1]){pc(c[1][3]);pc('\n');continue;}
        puts("DRAW");
    }
    return 0;
}

CF1846C

贪心+模拟。

先写罚时少的题一定更优,那么先把完成时间排序,一道道判断是否能做完即可。

注意罚时时间是从比赛开始到完成。

如果2~n中有选手分更多/同分更快 那么rk++

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,m,h,a[N],pts,tim,ttim,mp,mt,mtt,rk;
signed main(){
    t=read();
    while(t--){
        n=read();m=read();h=read();rk=1;pts=tim=ttim=0;
        for(int i=1;i<=m;i++)a[i]=read();
        sort(a+1,a+m+1);
        for(int i=1;i<=m&&a[i]+ttim<=h;i++)
            pts++,tim+=a[i]+ttim,ttim+=a[i];
        for(int k=2;k<=n;k++){
            mp=mt=mtt=0;
            for(int i=1;i<=m;i++)a[i]=read();
            sort(a+1,a+m+1);
            for(int i=1;i<=m&&a[i]+mtt<=h;i++)
                mp++,mt+=a[i]+mtt,mtt+=a[i];
            rk+=(mp>pts||(mp==pts&&mt<tim));
        }
        writel(rk);
    }
    return 0;
}

CF1846D

初中数学题。

先把所有三角形面积相加,再减去重叠面积即可

然后根据初中所学:

相似三角形面积比等于相似比平方

image

\(\dfrac{s_1}{s}=\dfrac{y_2+h-y_1}{h}\)

\(s_1=\dfrac{y_2+h-y_1}{h}\times s\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int ll
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-8;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,d,h,y,yy;
double ans,s;
signed main(){
    t=read();
    while(t--){
        n=read();d=read();h=read();
        s=d*h/2.0,ans=n*s;
        yy=read();
        for(int i=1;i<=n-1;i++){
            y=yy,yy=read();
            if(y+h<=yy)continue;
            ans-=((y+h-yy)/(double)h)*((y+h-yy)/(double)h)*s;
        }
        printf("%.8f\n",ans);
    }
    return 0;
}

CF1846E1 CF1846E2

问题:求满足 \(n=1+k+k^2+...+k^q\)\(n\) \((k>1,q>1)\)

考虑simple版的情况:\(n\le 10^6\)

直接暴力枚举 \(k,q\) 答案存到桶里即可

hard版 \(n\le 10^{18}\)

暴力枚举 \(k\) 需要枚举到 \(\sqrt n=10^9\) 复杂度显然会炸

考虑对于 \(k\in [\sqrt[3]{n},\sqrt n]\) \(\ 1+k+k^2+k^3\) 显然大于 \(10^{18}\) 那么只可能是 \(1+k+k^2\)

那么可以根号分治:

  • 对于 \(k\in [2,\sqrt[3]{n}-1]\) 暴力枚举 桶开不下可以用map
  • 对于 \(k\in [\sqrt[3]{n},\sqrt n]\) 直接求解 \(1+k+k^2=n\) 显然具有单调性 二分答案即可

运算过程可能炸 long long 需要开 __int128

(CF的c++14不支持__int128 会CE 建议开c++17)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define int __int128
#define gc getchar
#define pc putchar
const int N=2e5+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-8;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n;
map<int,bool>mp;
inl bool check(int x){return x*x+x+1>=n;}
signed main(){
    for(int k=2;k<=1e6;k++){
        int res=k+1,poww=k*k;
        while(res+poww<=1e18){
            res+=poww;
            mp[res]=1;poww*=k;
        }
    }
    t=read();
    while(t--){
        n=read();
        if(mp[n])puts("YES");
        else{
            int l=1e6,r=1e9,ans=0;
            while(l<=r){
                int mid=l+r>>1;
                if(check(mid)){
                    if(mid*mid+mid+1==n){ans=1;break;}
                    r=mid-1;
                }
                else l=mid+1;
            }
            if(ans)puts("YES");
            else puts("NO");
        }
    }
    return 0;
}

CF1846G

一道差不多的网络流24题P2761

注意到 \(n\) 很小,考虑状压

把所有状态当做点,所有药当做边,跑dij即可

连边时对于每个状态 \(i\),向 \(\text{(i-(i&a))|b}\) 连一条长为d的边

  • \(\text{i&a}\):药能治好的病
  • \(\text{i-(i&a)}\):药治不好的病
  • \(\text{(i-(i&a))|b}\):药治不好的病+后遗症
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline 
#define gc getchar
#define pc putchar
const int N=2e6+5;
const int M=1e8+5;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const double eps=1e-8;
inl int read(){
    int x=0,f=1;char c=gc();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
    return x*f;
}
inl void write(int x){
    if(x<0){pc('-');x=-x;}
    if(x>9)write(x/10);
    pc(x%10+'0');
}
inl void writei(int x){write(x);pc(' ');}
inl void writel(int x){write(x);pc('\n');}
int t,n,m,s;
char c;
int head[N],nxt[N],to[N],w[N],cnt,a[N],b[N],d[N];
inl void add(int u,int v,int c){
    nxt[++cnt]=head[u];
    to[cnt]=v;w[cnt]=c;
    head[u]=cnt;
}
inl void init(int n){
    memset(a,0,sizeof a);
    memset(b,0,sizeof b);
    for(int i=0;i<(1<<n);i++){
        int x=head[i];head[i]=0;
        while(x){
            to[x]=0;w[x]=0;
            int y=x;
            x=nxt[x];nxt[y]=0;
        }
    }
    cnt=0;
}
int dis[N],vis[N];
inl void dij(int s){
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
    memset(dis,0x3f,sizeof dis);
    memset(vis,0,sizeof vis);
    dis[s]=0;q.push({0,s});
    while(!q.empty()){
        int x=q.top().second;q.pop();
        if(vis[x])continue;vis[x]=1;
        for(int i=head[x];i;i=nxt[i]){
            int y=to[i],c=w[i];
            if(dis[y]>dis[x]+c){
                dis[y]=dis[x]+c;
                if(!vis[y])q.push({dis[y],y});
            }
        }
    }
}
signed main(){
    t=read();
    while(t--){
        init(n);
        n=read();m=read();s=0;
        for(int i=n-1;~i;i--){
            scanf(" %c",&c);
            s+=((c-'0')<<i);
        }
        for(int i=1;i<=m;i++){
            d[i]=read();
            for(int j=n-1;~j;j--){
                scanf(" %c",&c);
                a[i]+=((c-'0')<<j);
            }
            for(int j=n-1;~j;j--){
                scanf(" %c",&c);
                b[i]+=((c-'0')<<j);
            }
        }
        for(int i=0;i<(1<<n);i++){
            for(int j=1;j<=m;j++){
                add(i,(i-(i&a[j]))|b[j],d[j]);
            }
        }
        dij(s);
        writel(dis[0]^inf?dis[0]:-1);
    }
    return 0;
}
posted @ 2023-10-24 18:42  xiang_xiang  阅读(538)  评论(0编辑  收藏  举报