2022/6/1

这篇博客探讨了几种常见的算法问题解决策略,包括使用秦九韶算法进行十进制转换,模拟解决问题,通过递归和贪心策略寻找最优解,以及差分处理数据。作者提供了详细的代码示例和解题思路,涵盖了从基本的数学运算到复杂的数据处理技巧。
摘要由CSDN通过智能技术生成

福建农林

派蒙之灵

自己第一眼没有很好的处理方法,其实是对十转N,N转十,的模板,不熟练

N转十则是用秦九shao,res=res*b+str-'0';

正解:十转N递归反转,此题不需要求N进制形式,只需统计字母圈的个数

开个mp存下状态,直接连续赋值,统计就好

int a[16];
int main()
{
    a[0] = a[6] = a[9] = a[13] = 1;
    a[8] = a[11] = 2;
    int n, sum = 0;
    cin >> n;
    while (n)
    {
        sum += a[n % 16];
        n /= 16;
    }
    cout << sum;
    return 0;
}

派蒙家的荧女仆

正解:简单模拟,按题意模拟就行

int q[N];
void solved()
{
    int n;cin>>n;
    int mx=0,cnt=0;
    map<int,int> mp;
    for(int i=1;i<=n*2;i++)
    {
        cin>>q[i];
        mp[q[i]]++;
        cnt++;
        if(mp[q[i]]==2)cnt-=2;
         
        mx=max(mx,cnt);
    }
    printf("%d\n",mx);
    ;
}

派蒙的奇妙冒险------石之海

涂色,求最小涂色方案

正解:列出多组数据,发现答案只能是1或者2,特判就能过

void solved()
{
    int n;cin>>n;
if(n>=3)puts("2");
    else puts("1");

派蒙游戏世界对旅行荧妹很不友好

构造,贪心题目,只要输出合理就能过

正解:求i的等差数列前缀和,越过特判,否则有解,此时的迭代器-1就是Sn=a+b,

给出构造从这个迭代器往下枚举(因为解一定是来自某个i),求a的解所以>=a输出,一定可以找到这样一个序列

void solved()
{
    int a,b;cin>>a>>b;
     
    int sum=a+b;
     
    int cnt=0;
    int i=0;
    for( i=1;;i++)
    {
        cnt+=i;
        if(cnt>=sum)break;
    }
     
    if(cnt!=sum){puts("NO");return;}
    else{
        puts("YES");
        printf("%d\n",i);
            for(int j=i;j>=1;j--)
            {
                if(a>=j)printf("%d ",j),a-=j;
            }
            puts("");
    }
     
}

派蒙的风花,从下面看?还是从侧面看?

差分,自己写没考虑数据是查找多个差分值,这个时候就要离散化了。

正解:离散化差分,二分(很神奇)直接枚举l下标和r下标的差值,(upper,lower从英文字面意思理解)

把l,r,q[i]处理区间全加入一个vector排序去重

vector存一下枚举的l,r,用于差分操作

离散化从0往后取点,再对新数组差分,前缀和

int n,m;
int b[N],q[N];
vector<int> v1;
vector<PII> alls;
  
int find(int x){
    int l=0,r=v1.size()-1;
    while(l<r){
        int mid=l+r>>1;
        if(v1[mid]>=x) r=mid;
        else l=mid+1;
    }
    return l;
}
  
 
void solved()
{
    int n,m;cin>>n>>m;
    for(int i=1;i<=n;i++){
        int l,r;
       cin>>l>>r;
        v1.push_back(l);
        v1.push_back(r);
        alls.push_back({l,r});
    }
      
    for(int i=1;i<=m;i++){
        cin>>q[i];
        v1.push_back({q[i]});
    }
      
    sort(v1.begin(),v1.end());
    v1.erase(unique(v1.begin(),v1.end()),v1.end());
      
    for(int i=0;i<alls.size();i++){
        int l=find(alls[i].first),r=find(alls[i].second);
        b[l]+=1;
        b[r+1]-=1;
    }
      
   for(int i=0;i<N;i++) b[i]+=b[i-1];
      
    for(int i=1;i<=m;i++){
        printf("%d ",b[find(q[i])]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值