2020-2-11新生赛

问题 E: 求满足条件的数

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

输入N(n<=32767),输出N以内的整数(包括N),使其数字之和为15,每行输出8个数。输出场宽为6。

输入

只包括一个整数N。

输出

符合条件的数。

样例输入 Copy

200

样例输出 Copy

    69    78    87    96   159   168   177   186
   195

这道题很简单。但是注意输出格式,还有就是提议理解

人家题目说的是=15;我把别人写成%15==0;

我很醉

//第一次的错误代码
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[55];
int main()
{
    int n,cnt=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
       int sum=0,m=i;
       while(m)
       {
           sum+=m%10;
           m/=10;
       }
        if(sum%15==0)///人家说的是sum=15.....这个错误点
        {
            if(cnt%8==0&&cnt)printf("\n");
            printf("%6d",i);
            cnt++;
 
        }
 
    }
   return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[55];
int main()
{
    int n,cnt=0;
    scanf("%d",&n);
    for(int i=69;i<=n;i++)
    {
       //int sum=0;
      if((i%10+i/10%10+i/100%10+i/1000%10+i/10000%10)==15)
       {
            if(cnt%8==0&&cnt)printf("\n");
            printf("%6d",i);
            cnt++;
    }
 
    }
   return 0;
}

问题 B: 【分治】一元三次方程求解

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1。要求三个实根。

输入

四个实数:a,b,c,d

输出

由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位

样例输入 Copy

1 -5 -4 20

样例输出 Copy

-2.00 2.00 5.00

提示

数据规模和约定
|a|,|b|,|c|,|d|<=10

虽然不知道分治什么意思,这不就是精确到小数上的枚举吗????

#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[55];
int main()
{
  double a,b,c,d;
  int cnt=0;
  scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  for(double i=-100;i<=100;)
  {
      if(cnt==3) break;
      double sum=a*i*i*i+b*i*i+c*i+d;
      if(fabs(sum)<0.000001)
      {
          cnt++;
          printf("%0.2lf ",i);
      }
 
 
      i+=0.01;
  }
   return 0;
}

问题 C: 【动态规划】数的划分

时间限制: 1 Sec  内存限制: 256 MB
[提交] [状态]

题目描述

积极探索太空的回报是丰厚的,因为魔法世界的科学家后来通过挖掘史前文明遗址发现,他们所在的星球,每隔一亿五千万年左右就会发生一次由天外陨石或其他意外事件引发的物种大灭绝。称霸星球一亿多年的恐龙,就是因此而灭绝的。只有积极进取,锐意创新的宇宙文明,才有可能躲过这场“天罚”。现在,天顶星人对魔法世界发动了大规模陨石攻击,魔法世界的太空防御系统及时作出反应,将防御能量n分成k份以对付k个陨石,已知每份不能为空(否则会被陨石击中),任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的:1,1,5; 1,5,1; 5,1,1。问有多少种不同的分法。

输入

n,k (6<n≤200,2≤k≤6)

输出

一个整数,即不同的分法。

样例输入 Copy

7 3

样例输出 Copy

4

我不知道我是怎么了,基本上最近的所有动态规划都用成dfs来做。。。。。。

​#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int cnt=0;
int n,kk;
void dfs(int last,int k,int rest)//为了避免重复,我采用的是A1<=A2<=A3<=A4......这种思路
//last是的上次取得长度,rest指的是剩下的长度,始终保持rest>=last
{
    for(int i=last;i<=rest;i++)
    {
        if(k==kk-1)
       {
        if(rest>=last)
            cnt++;
            break;
       }
       else{
        if(i<=rest-i)
        dfs(i,k+1,rest-i);
       }
    }
 
}
int main()
{
    scanf("%d %d",&n,&kk);
   dfs(1,0,n);
   printf("%d",cnt);
   return 0;
}​

问题 F: 找最长良序字符串

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

我们将“ABC”或“ACEG”等类似的字串称为良序字串(因为它们是按ASCII码排列的),而像“ACB”或“ACCD”或“AGCD”则不可称为良序字串。
编写程序,将键入的一串字符中的最长良序字串找出来,并输出其长度。

输入

一串字符(长度≤255)。

输出

仅一行,一个最长良序字串的长度。

样例输入 Copy

23423555423567

样例输出 Copy

5

这个是一类求  最长单调(广义单调)的长度

//之前做过类似的题目,这种相当于求最长单调序列。。。
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[260];
int main()
{
     char str[260];
     scanf("%s",str);
     int len=strlen(str),ans=0;
     for(int i=1;i<len;i++)
     {
         if(str[i]>str[i-1]) A[i]=A[i-1]+1;
         ans=max(ans,A[i]);
     }
     printf("%d",ans+1);
   return 0;
}

问题 G: 取数排列

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

取1到N共N个连续的数字(1≤N≤9),组成每位数不重复的所有可能的N位数,按从小到大的顺序进行编号。当输入一个编号M时,就能打印出与该编号对应的那个N位数。例如,当N=3时,可组成的所有三位数为:

那么,输入编号M=2时,则输出132。

输入

包括两个数,即正整数N(1 <= N <= 9)和正整数M(1 <= M <= 362880)。

输出

只有一行,即与输入的编号M对应的那个N位数。

样例输入 Copy

3 2

样例输出 Copy

132

开始以为用排列组合来做,结果并不是。。。。用next_permutation(A,A+n),来做,结果不对,123 231 312

但是题目要求的是123 132 213 。。。。。那就dfs了呗

但是我卡了很久 又有一个点,注意观察我的代码注释,知道思考了很久。。。。
  

​
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int vis[10],A[10];
int n,k,cnt;
void dfs(int num)
{
    if(num==n+1)
    {
        cnt++;
    }
    if(cnt==k)
    {
        for(int i=1;i<=n;i++)
            printf("%d",A[i]);
    }
    else if(cnt<k)
    {
        for(int i=1; i<=n; i++)
        {
            if(vis[i])
                continue;
            else
            {
                A[num]=i;
                vis[i]=1;
                dfs(num+1);
                if(cnt<k)vis[i]=0;///////////////至关重要
            }
        }
    }
 
}
int main()
{
 
    scanf("%d%d",&n,&k);
    dfs(1);
 
    return 0;
}​

问题 I: 进制转换

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

乐乐正在学进制转换,但他老是搞不清楚到底自己是否做对,请你编一程序实现两种不同进制之间的数据转换,帮他检验。

输入

共有三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A~F表示数码10~15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。

输出

仅一行,包含一个正整数,表示转换之后的m进制数。

样例输入 Copy

16
FF
2

样例输出 Copy

11111111

好吧我承认我的进制转化,还不是很太熟练,但是,这道题查漏洞的时候做的很好,数据设计巧妙

12 ABA 10

然后我输出 了sum 还有答案 对比才知道 没有revese

请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!! 
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
char s[20]="0123456789ABCDEF";
vector<char> A;
int main()
{
    int n;
    char str[200];
    int m;
    scanf("%d",&n);
    scanf("%s",str);
    scanf("%d",&m);
    int len=strlen(str);
    ll sum=0,k=1;
    for(int i=len-1;i>=0;i--)
    {
        int num=0;
        if(str[i]<='9') num=str[i]-'0';
        else num=str[i]-'A'+10;
        sum+=num*k;////////
        k*=n;////////////
    }
 //printf("%lld\n",sum);
  while(sum)
  {
      int p=sum%m;
      A.push_back(s[p]);
      sum/=m;
  }
  reverse(A.begin(),A.end());//////////重要,这里卡了很久
  for(int i=0;i<A.size();i++)
  {
      printf("%c",A[i]);
  }
    return 0;
}

问题 H: 移动次数最少

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

有n堆糖果(2≤n≤200),排成一行,编号分别为1,2,…n。
已知每堆糖果有一定的颗数,且颗数之和均为n的倍数。移动各堆中的任意颗糖果,使每堆的数量达到相同,且移动次数最少。
  移动规则:
  每次可以移动任意的糖果颗数,第1堆可以移向第2堆,第2堆可以移向第1堆或第3堆,。。。。。。 第n 堆只可以移向第n -1堆。
例如,当n=4时:
堆号      1     2     3     4 
颗数      9     8     17    6
移动的方法有许多种, 其中的一种方案:
① 第3堆向第4堆移动4颗,成为:9    8    13    10
② 第3堆向第2堆移动3颗,成为:9    11   10    10
③ 第2堆向第1堆移动1颗,成为:10   10   10    10
经过三次移动,每堆都成为10颗。

输入

有两行。
第一行一个整数n。
第二行n个整数,用空格分隔。

输出

一个整数(表示最少移动次数)。

样例输入 Copy

4
9 8 17 6

样例输出 Copy

3

就是贪心,找到平均,反正他只能在相邻的两侧(除了头和尾的特殊情况)移动;;;;;

#include <bits/stdc++.h>
using namespace std;
const int mod=2e5+5;
typedef long long ll;
int A[250];
int main()
{
   int n,cnt=0;
   ll sum=0;
   scanf("%d",&n);
   for(int i=1;i<=n;i++)
   {
       scanf("%d",A+i);
       sum+=A[i];
   }
 //printf("%lld\n",sum);
    int anv=sum/n;
   for(int i=1;i<n;i++)
   {
      if(A[i]<anv)
      {
          cnt++;
          A[i+1]-=(anv-A[i]);
      }
      if(A[i]>anv)
      {
          cnt++;
          A[i+1]+=(A[i]-anv);
      }
   }
   printf("%d",cnt);
    return 0;
}
发布了32 篇原创文章 · 获赞 1 · 访问量 1336

猜你喜欢

转载自blog.csdn.net/QXK_Jack/article/details/104270365
今日推荐