Codeforces Round 928(Div. 4)

Dashboard - Codeforces Round 928 (Div. 4) - Codeforces

第一次参加CF,最后一道题连题都没读,下次不会就跳,菜是原罪

A:找字符串中A,B数量,遍历一下最后比较即可

B:判断是三角形还是正方形,题目表示除了正方形就是三角形,所以直接判断是不是正方形,用ans数组记录每一行 1 的个数,然后从大到小排序,如果有ans[1] 和 ans[2]相等,就是正方形,不然就是三角形

复制代码
void solve(){
    int n;cin>>n;
    memset(a,0,sizeof(a));
    memset(ans,0,sizeof(ans));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
            if(a[i][j]-'0'==1) ans[i]++;
        }
    }
    sort(ans+1,ans+1+n,cmp);
    if(ans[1]==ans[2]) cout<<"SQUARE"<<endl;
    else cout<<"TRIANGLE"<<endl;
}
复制代码

C:计算数位和,但是直接算的话会超时,所以其实考察的是前缀和,提前把200000个数每个数的数位和计算并存起来,直接用就可以了

复制代码
int a[maxn],b[maxn];
int f(int x){
    int ans=0;
    while(x>0){
        ans+=x%10;
        x/=10;
    }
    return ans;
}
void solve(){
    int n;cin>>n;
    cout<<b[n]<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    for(int i=1;i<=200000;i++){
        a[i]=f(i);
        b[i]=b[i-1]+a[i];
    }
    int t;cin>>t;
    while(t--){
        solve();
    } 
    
    return 0;
}
复制代码

D:判断是否存在两个数二进制的每一位都不相同,注意这里需要判断31位,如果输入的n个数中存在两个数的每一位都不同,就在一个组,不然那个数一个人一组,可以发现这两个数异或为0。

思路是用map来记录,如果跟这个数异或为0的数没出现过,先让它自己一个组,把他的另一半(即异或为0的数)也放进来,这样下次碰见他的另一半的时候,发现关于他已经有一个组了,直接把他从组里删除就可以了

复制代码
void solve(){
    int n;cin>>n;
    map<ll,int> mp;
    int ans=0;
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        if(!mp[x]){
            ans++;
            mp[((1<<31)-1)^x]++;
        }else mp[x]--; 
    }
    cout<<ans<<endl;
}
复制代码

E:放牌的问题,根据样例的解释模拟一下,发现跟分治有点沾边,下面是一个推导:

当n=7:

f(1,2,3,4,5,6,7)
=f(2,4,6)  相当于  ( f(1,2,3) )*2
=f(2) 相当于 ( f(1) )*2

所以相当于每次删去奇数,剩下的偶数 / 2 变成奇数,以此循环往复
当n=18:
f([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18], 15)
=f([2,4,6,8,10,12,14,16,18], 6)    删掉:(18+1)/2个数
=f([1,2,3,4,5,6,7,8,9], 6)*2          
=f([2,4,6,8], 1)*2    删:(9+1)/2个数
=f([1,2,3,4], 1)*4

复制代码
void solve(){
    int n,k;cin>>n>>k;
    int cnt=0; //轮次 
    while(k>(n+1)/2){ //k大于奇数的个数 
        int num=(n+1)/2; //奇数的个数 
        k-=num;  //奇数在第一轮已经放下,所以减去放下的数 
        n/=2;    //剩下元素/2变成奇数 
        cnt++;   //轮次+1 
    }
    cout<<((2*k-1)<<cnt)<<endl;  
}
复制代码

 

继续努力吧,争取下次Div4全部写完

posted @   ACCbulb  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示