首页 > 其他分享 >周报4

周报4

时间:2024-02-20 22:00:43浏览次数:24  
标签:pre 数字 int cin -- 周报 前缀

补题1:秀恩爱分的快

题意:

做法:先读入照片的数据存起来,知道A,B的性别之后再遍历照片,按照异性进行cnt.有一个细节就是0和-0是无法区分的如果不用字符串读入的话。所以要字符串来存数据,后面再做判断,剩下的就简单遍历一下照片,然后relateA和relateB分开计算即可。

bool cmp(pair<double,int> a,pair<double,int> b){
    if(a.first!=b.first) return a.first>b.first;
    return a.second<b.second;
}
void solve(){         //补7-12秀恩爱分的快
    int n,m,k;
    pair<double,int> relateA[1005];
    pair<double,int> relateB[1005];
    cin>>n>>m;
    for(int i=0;i<1000;i++){  //init
        relateA[i].first=0;
        relateA[i].second=i;
        relateB[i].first=0;
        relateB[i].second=i;
    }
    string x;
    vector<string> vct[m];
    for(int i=0;i<m;i++){
        cin>>k;
        while(k--){
            cin>>x;
            vct[i].emplace_back(x);
        }
    }
    bool sexA=false,sexB=false;
    string A,B;
    int numa,numb;
    cin>>A>>B;
    if(A[0]=='-') {
        sexA=true;
        numa=stoi(A.substr(1,A.size()-1));
        numb=stoi(B);
    }
    else {
        sexB=true;
        numb=stoi(B.substr(1,B.size()-1));
        numa=stoi(A);
    }
    for(int i=0;i<m;i++){
        if(sexA){   //A为负
            if(find(vct[i].begin(),vct[i].end(),A)!=vct[i].end()){
                for(auto v:vct[i]){
                    if(v[0]!='-'&&v!=A) relateA[stoi(v)].first+=1.0/vct[i].size();
                }
            }
            if(find(vct[i].begin(),vct[i].end(),B)!=vct[i].end()){
                for(auto v:vct[i]){
                    if(v[0]=='-'&&v!=B) relateB[stoi(v.substr(1,v.size()-1))].first+=1.0/vct[i].size();
                }
            }
        }
        else{  //B为负
            if(find(vct[i].begin(),vct[i].end(),A)!=vct[i].end()){
                for(auto v:vct[i]){
                    if(v[0]=='-'&&v!=A) relateA[stoi(v.substr(1,v.size()-1))].first+=1.0/vct[i].size();
                }
            }
            if(find(vct[i].begin(),vct[i].end(),B)!=vct[i].end()){
                for(auto v:vct[i]){
                    if(v[0]!='-'&&v!=B) relateB[stoi(v)].first+=1.0/vct[i].size();
                }
            }
        }
    }
    sort(relateA,relateA+1000,cmp);
    sort(relateB,relateB+1000,cmp);
    bool checka=false,checkb=false;
    for(int i=0;i<1000;i++){
        if(relateA[i].first!=relateA[0].first) break;
        if(relateA[i].second==numb) {
            checka=true;
            break;
        }
    }
    for(int i=0;i<1000;i++){
        if(relateB[i].first!=relateB[0].first) break;
        if(relateB[i].second==numa) {
            checkb=true;
            break;
        }
    }
    if(checka&&checkb) cout<<A<<" "<<B;
    else{
        for(int i=0;i<1000;i++){
            if(relateA[i].first!=relateA[0].first) break;
            if(sexA) cout<<A<<" "<<relateA[i].second<<endl;
            else cout<<A<<" -"<<relateA[i].second<<endl;
        }
        for(int i=0;i<1000;i++){
            if(relateB[i].first!=relateB[0].first) break;
            if(sexB) cout<<B<<" "<<relateB[i].second<<endl;
            else cout<<B<<" -"<<relateB[i].second<<endl;
        }
    }
}

补题2:数三角形(eazy)

题意:

做法:暴力枚举*当做顶点即可,但是也不能太暴力,需要加上前缀和来判断底边那个直线,不然会一个底会被重复数很多次,非常浪费时间。写的时候也想了一下加个前缀和,但是感觉不需要,就没加前缀和了。实际上不加前缀会浪费很多时间。用了前缀和之后,每次判断底边是否全都是*,o(1)即可,否则又要遍历底边。

void solve(){           //数三角形(eazy)--遍历,遇到*就往下找-TLE -->用递归?--也是TLE ;;;遇到*就往下找-加一个前缀和
    //加一个前缀和来判断直线!!!不然会多次跑重复的,非常浪费时间
    int n,m,ans=0;     //o(n^4)会TLE, o(n^3)可以
    cin>>n>>m;
    string maze[505];
    int pre[505][505];
    for(int i=0;i<n;i++) cin>>maze[i];
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(j==0){
                if(maze[i][j]=='*') pre[i][j]=1;
                else pre[i][j]=0;
            }
            else{
                if(maze[i][j]=='*') pre[i][j]=pre[i][j-1]+1;
                else pre[i][j]=pre[i][j-1];
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(maze[i][j]=='*'){
                int l,r;
                for(int f=1;1;f++){
                    if(i+f<n&&j-f>=0&&j+f<m&&maze[i+f][j-f]=='*'&&maze[i+f][j+f]=='*') {
                        l=j-f,r=j+f;
                        if(l==0&&pre[i+f][r]==r+1) ans++;  //pre[i+f][r]==r --> ==r+1  !!!下标从0开始的
                        else if(pre[i+f][r]-pre[i+f][l-1]==r-l+1) ans++;
                    }
                    else break;
                }
            }
        }
    }
    cout<<ans<<endl;
}

补题3:漂亮数组

题意:

做法:记录一个前缀和,每次计算出当前位置前缀和时,把该位置前缀和%k,如果得出的数字是前面前缀和出现过的数字,或刚好可以%k==0。那么那个数字的后一个位置到现在这个位置就是一个合法区间 //因为一旦出现k的倍数,取余加法是有分配律的,k的倍数取余之后为0,加上前缀和会变成之前出现过的数字。再加上贪心即可得出答案。

int pre[200005];
void solve(){           //E漂亮数组--一眼感觉双指针
    // 当l,r满足时,应该立即切断。如果还往里面加东西,肯定就不是k的倍数了;除非又加了一次k的倍数进去,那么这样就会少了一个答案。(贪心)
    //NoNoNo--这个区间可能只有中间一段是可以的,前面和后面要舍弃。
    //那怎么知道前面应该舍弃多少?dp??--不是dp
    //做法:记录一个前缀和,每次计算出当前位置前缀和时,把该位置前缀和%k,如果得出的数字是前面前缀和出现过的数字,那么那个数字的后一个位置到现在这个位置就是一个合法区间
    //因为一旦出现k的倍数,取余加法是有分配律的,k的倍数取余之后为0,加上前缀和会变成之前出现过的数字。再加上贪心即可
    int n,x,k,ans=0;
    cin>>n>>k;
    unordered_map<int,int> mp;
    for(int i=1;i<=n;i++){
        cin>>x;
        pre[i]=pre[i-1]+x;
        if(mp[pre[i]%k]||pre[i]%k==0) {
            ans++;
            pre[i]=0;       //不影响后面的,前面的数据已经没用
            mp.clear();
        }
        else mp[pre[i]%k]=1;
    }
    cout<<ans<<endl;
}

补题4:FinalCountdown

题意:

做法:这题实质上是要数每一位会发生多少次变化的总和。只要意识到这点,那么答案显而易见。例如12345,个位会变化12345次,十位会变化1234次,百位会变化123次,千位会变化12次,万位会变化1次。全部加起来即是答案。自己被样例的解释影响太深了,按照样例的想法计算,一直算不对..

注意这题的数字很大,都是字符串输入的,所以用高精度来存数字。

 

标签:pre,数字,int,cin,--,周报,前缀
From: https://www.cnblogs.com/ouhq/p/18019216

相关文章

  • winter 2024 第三四周周报
    内容week3day1https://www.cnblogs.com/bible-/p/18018423这天是打寒假牛客2,请假了后面补的题,补了10道吧,感觉这些题花点时间都是可以写的,但是赛时真的很容易被卡,板子题也挺多,线段树、树状数组、字典树(太久不写有点忘了)week3day3https://www.cnblogs.com/bible-/p/18011488打......
  • 第三周第四周周报
    这两周因为过年的原因训练的时间相对来说少了一些,但是codeforces上的比赛并没有落下,也补了以前的一些习题。寒假已经过去了一大半,总的来说进步自我感觉还是有的,特别是对以前不熟悉的算法加深了理解,运用上也更加流畅了起来。在学校的时候因为有课很少打cf上的比赛,害怕影响第二天的......
  • SMU Winter 2024 div2 ptlks的周报Week 3(2.12-2.18)
    这周主要加强了对知识点的掌握。P10161[DTCPC2024]小方的疑惑10从题目可以得知a个连续括号贡献为a(a+1)/2,代价为2a。要求总贡献恰为k,且代价不高于n。一开始我想到了模拟,先取一个贡献低于k最大的a,剩下的再直接在外面套括号,结果wa。又想到可以分出多个a来组成k,就用递归,每次......
  • 《安富莱嵌入式周报》第332期:铷时钟控制板,航天战斗机C++代码标准,免费开源芯片设计,在线
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版https://www.bilibili.com/video/BV1tU421d7ZK/目录:1、Rubidium铷时钟控制板2、开源小设计,简易万用表连通性测试仪3、免费开源芯片设计软件Electric4、在线电路仿......
  • 周报3
    补题1:TokitsukazeandPassword(easy)题意:给一个只包含数字0到9,字母a,b,c,d,_.的字符串(1<=length<=9)和一个数字Y,其中a,b,c,d,_;都是未知的,且a,b,c,d直接各不相等,_无限制。问在没有前导0的前提下,a,b,c,d,_;填入数字,得出来的stoi(str)且是8的倍数,且小于Y.的填法有多少种。做......
  • winter 2024 第二周周报
    内容winterweek2day1这套题复习了最短路,主要是dp,都是比较好推的dp,还是要多写dp吧,感觉写dp用的时间太久了day2这天是ccf的测试赛,测完就练了套河南大学联赛,10题看当时榜可能第八,只能说队友太给力了。写的那道l感觉挺好想的求方案数,刚开始也是在猜结论,没有想着去好好推qwq,后面......
  • 第二周周报
    训练赛2024蓝桥杯模拟赛2(div1+div2)题解2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(重现赛)题解2024牛客寒假算法基础集训营1题解自主训练题解题解题解......
  • SMU Winter 2024 div2 ptlks的周报Week 2(1.29-2.4)
    这周学习到的知识点有斯特林数(F鸡数题!)F鸡数题!思路第二类斯特林数代码#include<bits/stdc++.h>#defineintlonglong#defineMOD1000000007usingnamespacestd;intn,m,f[100005],fi[100005];intqpow(inta,intn){ intans=1; while(n){ if(n&1){ ......
  • 周报2
    补题1:[蓝桥杯2013国AC]网络寻路题意:找出包含四个结点的路径条数,源结点和终结点可以相同,但中间节点必须不同。做法:dfs暴力搜简单易想,但是会TLE。另一种巧妙的做法,枚举每一条边(最多1e5条),固定每一条边,ans+=(du[u]-1)*(du[v]-1)*2;即为答案。一条边固定两个端点,剩下两个端点在相互......
  • KubeSphere 社区双周报|Fluent Bit 升级到 v2.2.2|2024.01.18-02.01
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.01.18-02.01。贡献者名单新晋KubeSpherecontribut......