首页 > 其他分享 >0318-0324题解

0318-0324题解

时间:2024-03-24 17:12:10浏览次数:17  
标签:0324 cnt temp int 题解 pos long -- 0318

成信大天梯赛

L1-6 二进制
因为二进制是逢二进一,所以我们只要用cnt记录一下每一位上的数并给它加起来,然后cnt%2便是其和这一位上的数,注意要从右往左开始

点击查看代码
#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> pii;


void solve()
{
   string a,b;
    cin>>a>>b;
    string res;
    int i=a.size()-1,j=b.size()-1;
    int cnt=0;
    while(i>=0||j>=0||cnt){//注意cnt这个条件
        cnt+=(i>=0)?a[i--]-'0':0;//别忘了i--,j--
        cnt+=(j>=0)?b[j--]-'0':0;
        res.push_back(cnt%2+'0');//这边记得加‘0’
        cnt/=2;//别忘了除2
    }
    reverse(res.begin(),res.end());
    cout<<res;
}



signed main()
{
    solve();
    
}

L1-8 堆积木
这一题是个好题,我们要学习一个思想,把一些可以舍弃的数据舍弃掉,比如在这一题里面,每一个积木只跟上一个积木有关系,所以我们只用一个数组格便可以代表一个塔,可以将上上个覆盖掉,同样是stl的模拟题,还是要多练多练,下列代码有详细的注解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
    //做这种题首先要思考用什么容器来模拟题意
    vector<int>ve;//一个存塔的数量
    vector<int>he;//一个存高度
    int n;
    cin>>n;
    while(n--)
    {
        int x;
        cin>>x;
        if(ve.size()==0){//如果没有塔就新建一个塔
            ve.push_back(x);
            he.push_back(1);
        }
        else{
            int pos=-1,minn=1e9;//pos用来实现位置的更新
            //有塔就遍历塔找符合的
            for(int j=0;j<ve.size();j++)
            {
                if(ve[j]>x){
                    int temp=ve[j]-x;
                    if(temp<minn)
                    {
                        pos=j;
                        minn=temp;
                    }
                    else if(temp==minn){//如果差值相同就放在最高的上面
                        if(he[j]>he[pos]){
                            pos=j;
                        }
                        
                    }
   
                }
  
            }
            
            if(pos==-1){// 没有找到
                ve.push_back(x);
                he.push_back(1);
            }
            else{//找到了直接覆盖这个塔顶,因为下一个状态只跟当前的这个有关
                ve[pos]=x;
                he[pos]++;
            }
            
        }
    }
    
    int ans=0;
    for(int i=0;i<ve.size();i++) ans=max(he[i],ans);
    cout<<ans<<" "<<ve.size()<<endl;
}



signed main()
{
    solve();
    
}

天梯赛训练

P2669 [NOIP2015 普及组] 金币
这确实是一道简单题,但是如果你没处理好,可能会很浪费你的时间,这题给了我一个启发,就是把平方的归为一部分,其他的再加上去

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
#define int long long

void solve()
{
   int n,sum=0,temp=1,cnt=1,last=0;
   cin>>n;  
   while(1)
   {
       if(cnt>n) break;
       sum+=temp*temp;
       temp++;
       last=cnt;
       cnt+=temp;
   }
    if(last!=n){
        sum+=(n-last)*temp;
    }
    cout<<sum;
}



signed main()
{
    solve();
    return 0;
}
点击查看代码
#include<iostream>
using namespace std;
int main()
{
	int a,b=0,c=1,i;//a为天数,b为金币,c为每天比原来每天多获得的金币数 
	cin>>a;
	for(i=1;i<=a;i++)
		a-=i,b+=c*c,c++;//金币每天加上c的2次方,天数当然要减i了
	cout<<b+a*c;//最后算上剩余的a乘加的最多一次的c
	return 0;
}

P7071 [CSP-J2020] 优秀的拆分
先打个表把2的1到24次方打印出来,然后一个数我们从2的24次方开始遍历,遇到比他小的第一个数我们就减掉然后跳出循环,然后变成一个新的数以后再找第一个比它小的数以此下去

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
#define int long long
char c[105][105];
int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};
int a[25],b[25][25];
void solve()
{
    for(int i=1;i<=24;i++) a[i]=(int)pow(2,i);

   int n;
   cin>>n;
   if(n%2==1) cout<<"-1";
   else{
       while(n>0)
       {
            for(int i=24;i>=1;i--){
                if(a[i]<=n){
                    cout<<a[i]<<" ";
                    n-=a[i];
                    break;
                }
            }
       }
   }
    
}

signed main()
{
    solve();
    return 0;
}

P2058 [NOIP2016 普及组] 海港
这一题我们用set来存国籍的种类,用map来存国籍的人数,用一个存放pii的优先队列(会按点的第一个值来自动排序)来存每次每个国籍加入的时间,当时间超过了86400的时候我们便把优先队列中的这个时间对应的国籍删掉,对应的map中的这个国籍人数也要减,当对头对应的map中的国籍的人数为1的时候,set就除去这个国籍

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
#define int long long
char c[105][105];
int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,1,1,1,0,-1,-1,-1};
int a[25],b[25][25];
set<int> se;
 priority_queue<pii,vector<pii>,greater<pii> >q;
unordered_map<int,int>mp;
void solve()
{
    int n,m;
   
    cin>>n>>m;
    while(m--)
    {
        int x;
        cin>>x;
        q.push({n,x});
        mp[x]++;
        se.insert(x);
    }
    
    while(n-q.top().first>=86400)
    {
        auto k=q.top();
        q.pop();
        if(mp[k.second]==1) se.erase(k.second);
        mp[k.second]--;
    }
    cout<<se.size()<<endl;
    
    
}

signed main()
{
    int t;
    cin>>t;
    while(t--)solve();
    return 0;
}

专题训练

还没复盘完毕

标签:0324,cnt,temp,int,题解,pos,long,--,0318
From: https://www.cnblogs.com/swjswjswj/p/18092460

相关文章

  • 20240318-2-推荐算法Graph_Embedding
    GraphEmbedding在许多推荐场景下,可以用网络结构数据来刻画对象(用户、商品等)之间的关系。例如:可以将用户和商品作为网络中的结点,用户和商品之间的边代表购买关系。GraphEmbedding是一种将网络中对象之间的关系转换为每个对象的(向量)特征的一种技术。其主要想法是输入网......
  • 20240318-1-推荐算法gbdt_lr
    gbdtlrgbdt+lr是facebook提出在线广告模型,我们知道LR之前在广告和推荐系统由于其快速的计算而被广泛使用,使用由于lr是线性模型,其模型表现能力不强,需要做大量的特征工程。facebook提出提出使用决策树进行特征embedding。为了提升线性分类器的准确度,有两种方法进行特征......
  • 广州大学第十八届ACM大学生程序设计竞赛(同步赛)——题解
    这套题我答的很失败。没有按照题目的难度去答题,前期浪费了不少时间。题目:A-字符画题解:思维、模拟。这道题我的通过率为62.5,没有过的原因是因为对细节的处理和把控不到位,对一些点忽视,我也记录了搜索的过程,但没有把搜索过的点消掉,而且没有找到最好的顺序去解答这道题,我是按照横的......
  • 字母迷宫题解
    思路:看到这题一眼跑广搜,但是转眼天堂之门,欸为什么要加2?好像没法广搜(不满足广搜特性),咋办?凉拌。该怎么让它满足广搜特性(先搜到的是最优的)。欸,我们是不是可以将队列换成优先队列让先搜到的最优。好像是的欸,优先队列启动!代码:#include<bits/stdc++.h>usingnamespacestd;inta......
  • cfEduRound163div2--D题解
    D-TandemRepeats?题意:做法:因为字符串长度较少,可以考虑枚举。or--动态规划voidsolve(){//D枚举//枚举!!!!!!!!!!stringstr;cin>>str;intn=str.size(),ans=0;for(inti=1;i<=n/2;i++){//枚举一半!!!intcnt=0;for(intj=0;......
  • 题解 CF1948G【MST with Matching】
    非常精彩的转化!显然,树是二分图。由König定理,我们知道:二分图最小点覆盖等于最大匹配。因此枚举点覆盖\(S\),则一条边\((u,v)\)可以被选择,当且仅当\(u\inS\lorv\inS\),在所有可以选择的边上跑最小生成树即可。我采用的是Kruskal算法,时间复杂度为\(O(2^nn^2\logn)\),可......
  • 20240324每日一题题解
    20240324每日一题题解Problem给两个按照非递减顺序排列的整数数组num1和num2,另外有两个整数m和n,分别表示num1和num2中的元素数目。请合并num2到num1中,使得合并后的数组还是按照非递减顺序排列。注意,需要将合并之后的数组还是存储在数组num1中。示例1:输入:nums1=[1,2,3,0,......
  • 牛客周赛ROUND37--C题解
    C-红魔馆的馆主(495倍数)题意:做法:dfs搜索后面添加的数字。stringans="1000000000000000000";voiddfs(intcur,stringaddnum){//用数字写的话会无限dfs,因为addnum永远等于0。if(cur==0){if(addnum.size()<ans.size())ans=addnum;return;......
  • 最长子字符串的长度(二)【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-最长子字符串的长度(二)给你一个字符串s,字符串s首尾相连成一个环形,请你在环中找出’l’、‘o’、‘x’字符都恰好出现了偶数次最长子字符串的长度。输入描述:输入是一串小写的字母组成的字符串。输出描述:输出是一个整数补充说明:1<=s.length<=5x10^5......
  • 孙悟空吃蟠桃【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-孙悟空吃蟠桃孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间里不再......