四道好题分享(看似简单,但是棘手)

简介: 四道好题分享(看似简单,但是棘手)

字符串丝带 (nowcoder.com) 


11.1.png

#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int main()
{
    char str[N];
    int cnt[N];
    int ind[N];
    int n,m;
    scanf("%d %d",&n,&m);
    scanf("%s",str+1);
    for(int i = 1 ; i <= n ;i++){
        cnt[str[i] - 'a']++;
        ind[i] =cnt[str[i] - 'a'];
    }
    int x;
    while(m--) {
        scanf("%d",&x);
        printf("%d\n",ind[x]);
    }
    return 0;
}

 [NOIP2017]图书管理员 (nowcoder.com)


11.2.png

image.png

 排序——寻找min,如果找到了,立即break

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,q;
    cin>>n>>q;
    long long a[n+1];
    for(int i=1;i<=n;i++)
  {
        cin>>a[i];
    }
    sort(a+1,a+1+n);//排序!!!
    for(int i=1;i<=q;i++)
  {
        long long len,x;
        cin>>len>>x;
        long long y=pow(10,len);//妙!!!
        for(int j=1;j<=n;j++)
    {
            if(a[j]%y==x)
      {
                cout<<a[j]<<endl;
                break;
            }
            if(j==n)
      cout<<-1<<endl;
        }
    }
    return 0;
}

 或者

#include<bits/stdc++.h>
using namespace std;
int main()
{
  int n,q,len;
  vector<string> ve;
  vector<int> nt;
  string s;
  cin>>n>>q;
  while(n--)
  {
    cin>>len;
    nt.push_back(len);
  }
  sort(nt.begin(),nt.end());//排序!!!
  for(auto i:nt)//遍历nt容器
  {
    ve.push_back(to_string(i));//to_string 把i变成字符串
  }
  while(q--)
  {
    cin>>len>>s;
    int flag=0;
    for(auto i:ve)
    {
      int x=i.size()-len;
      if(x<0)
      {
        continue;
      }
      if(i.substr(x,len)==s)//截取字符串
      {
        flag=1;
        s=i;
        break;
      }
    }
    if(flag)
    {
      cout<<s<<endl;
    }
    else
    {
      cout<<"-1"<<endl;
    }
  }
}

[NOIP2007]纪念品分组 (nowcoder.com)

11.3.png11.4.png

#include <iostream>
#include<algorithm>
using namespace std;
int n,w;
const int N=10010;
int p[N];
int main()
{
    cin>>w>>n;
    for(int i=0 ;i < n;i ++ ) cin>>p[i];
    sort(p,p+n);//注意已经排过序了
  int res =0;
    int l=0;
    for(int i=n-1;i >= l;i -- )
    {
        if(p[i] + p[l] <= w ) l ++;
        res ++ ;
    }
    cout<<res<<endl;
    return 0;
}

拼数 (nowcoder.com)

image.png

🍔🍔🍔string类型的按ASCII比较大小

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool cmp (string a, string b)
{
    return a + b > b + a;
}
int main()
{
    string s[21];
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++ ){
        cin >> s[i];
    }
    sort(s + 1, s + 1 + n, cmp);
    for(int i = 1; i <= n; i ++ ){
        cout << s[i];
    }
}

11.5.png

11.6.png

如果Sl!=Sl+i,继续进行


一旦Sl=Sl+1,立刻截至,即使后面有Sl!=Sl+i也不能进行

#include <stdio.h>
int main(void) {
  int n;
  char s[5000];
  scanf("%d", &n);
  scanf("%s", s);
  for (int i = 1; i < n; i++)
  {
    int l = 0;//关键点
    while (l + i != n && s[l] != s[l+i])
    {
      l++;
  }
    printf("%d\n", l);
  }
  return 0;
}

目录
打赏
0
0
0
0
8
分享
相关文章
|
11月前
|
c语言编程练习题:7-39 龟兔赛跑
c语言编程练习题:7-39 龟兔赛跑
172 0
第一周算法设计与分析:B : 如何溜的最快
这篇文章提供了解决算法问题"如何溜的最快"的方法,即计算从原点(0,0)到任意点(x,y)所需的最短步数,每步长度固定为R,通过特判和计算总距离除以步长向上取整来确定步数。
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(二)
这篇内容是关于解题策略的,主要介绍了在面对应用题时可以采用的“三板斧”方法:举例、模拟和找规律。通过一个走楼梯的例子详细解释了这三个步骤如何运用。首先,举例将抽象问题具体化,比如走5级台阶有几种方式。其次,通过模拟不同情况,例如思考走每一步的可能,发现递归或循环的模式。最后,通过找规律归纳出一般性的解决方案,这里发现走台阶问题与斐波那契数列相关。文章还提到了一个拓展案例——矩形覆盖问题,同样可以用类似的方法分析。总的来说,文章强调了解题过程中理解和转化问题的重要性,以及通过训练提升这方面能力。
86 0
|
11月前
|
青蛙跳台阶:我如何得知它是一道斐波那契数列题?——应用题破题“三板斧”(一)
这篇内容介绍了C语言学习中的经典例题——斐波那契数列,强调了解题思路的重要性。斐波那契数列是一个数列,其中每个数是前两个数的和。文章指出,很多类似题目,如“青蛙跳台阶”,实质上都在考察斐波那契数列的实现。文中提供了斐波那契数列的定义、代码实现和递归与非递归的思路,并鼓励读者从问题中分析出解题模型,而非直接套用已知方法。此外,还提及了一道相关题目“矩形覆盖问题”,以供进一步练习。
103 0
|
11月前
日拱一卒,月进一步(6)(杨辉三角2)
119. 杨辉三角 II - 力扣(LeetCode)
75 0
常用算法复杂度速查表,蹲坑的功夫都能背
常用算法复杂度速查表,蹲坑的功夫都能背
46 0

热门文章

最新文章

相关实验场景

更多
下一篇
oss创建bucket