2020-1-31新生赛

这道题,emmm经验不足
问题 A: 珠心算测验
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和? 最近老师出了一些测验题,请你帮忙求出答案。
输入
输入共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。 第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。3<=n<=100,给出的正整数大小不超过10000
输出
输出共一行,包含一个整数,表示测验题答案。
样例输入 Copy
4
1 2 3 4
样例输出 Copy
2
提示
由1+2=3,1+3=4,故满足测试要求的答案为2。注意,加数和被加数必须是集合中的两个不同的数。

题意:求一个数可以由两个不同的数相加,开始想用bfs(全排列那种),但是此题只有两个数想加,没必要,先排序,后面的由前面的两不同数相加

#include<bits/stdc++.h>
using namespace std;
int A[105],n;
bool cmp(int x,int y)
{
    return x<y;
}
int main()
{
   scanf("%d",&n);
   for(int i=1;i<=n;i++)
   {
       scanf("%d",&A[i]);
   }
   sort (A+1,A+1+n,cmp);
   int cnt=0;
   for(int i=3;i<=n;i++)
   {
       int f=1;
       for(int j=1;j<i-1;j++)
       {
           for(int k=j+1;k<i;k++)
           {
               if(A[j]+A[k]==A[i]&&A[k]!=A[j]) {
                    cnt++;f=0;break;}
           }
           if(f==0) break;
       }
   }
   printf("%d",cnt);
    return 0;
}

问题 B: 比例简化
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902。

不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。

现给出支持人数A,反对人数B,以及一个上限L,请你将A比B化简为A’比B’,要求在A’和B’均不大于L且A’和B’互质(两个整数的最大公约数是1)的前提下,A’/B’≥A/B且A’/B’-A/B的值尽可能小。
输入
输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。1≤A≤1,000,000,1≤B≤1,000,000,1≤L≤100,A/B≤L。
输出
输出共一行,包含两个整数A’,B’,中间用一个空格隔开,表示化简后的比例。
样例输入 Copy
1498 902 10
样例输出 Copy
5 3

解题思路:最开始用打表法把1—l中的所有质数还有1存下,再两两组合,看哪个更贴合原比例,但是 我忘了11 99 10 —答案应该为1:9,而我的做法只能是1:7

#include<bits/stdc++.h>
using namespace std;

int main()
{
   int a,b,l;
   scanf("%d %d %d",&a,&b,&l);
   double c=a*1.0/b,minn=10000;
   int down,up;
   for(int i=1;i<=l;i++)
   {
       for(int j=1;j<=l;j++)
       {
           int m=i,n=j;
           while(m%n!=0)
           {
               int s=m%n;
               m=n;
               n=s;
           }
           if(n==1)//最大公因数=1(!=)互质
           {
               double temp=i*1.0/j-c;
               if(temp<0) continue;
               else
                {
                if(temp<minn)
                {
                    minn=temp;
                    up=i;
                    down=j;
                }
              }
           }
       }
   }
   printf("%d %d",up,down);
    return 0;
}


加粗样式

问题 G: Digits in Multiplication
时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
You are given an integer N.
For two positive integers A and B, we will define F(A,B) as the larger of the following: the number of digits in the decimal notation of A, and the number of digits in the decimal notation of B.
For example, F(3,11)=2 since 3 has one digit and 11 has two digits.
Find the minimum value of F(A,B) as (A,B) ranges over all pairs of positive integers such that N=A×B.

Constraints
1≤N≤1010
输入
The input is given from Standard Input in the following format:
N
输出
Print the minimum value of F(A,B) as (A,B) ranges over all pairs of positive integers such that N=A×B.
样例输入 Copy
10000
样例输出 Copy
3
好好积累学习,这种做法很巧

#include<bits/stdc++.h>
using namespace std;
int fun(int a,int b)
{
    int cnt1=0,cnt2=0;
   for(int i=1;;i++)
   {
       if(a==0&&b==0) break;
       if(a) cnt1++;
        a=a/10;
       if(b) cnt2++;
         b=b/10;
   }
   return max(cnt1,cnt2);
}
int main()
{
  long long int n;
  scanf("%lld",&n);
  int minn=100000;
  for(int i=sqrt(n);i>=1;i--)
  {
      if(n%i==0)
        {
         minn=min(minn,fun(i,n/i));
        }
  }
  printf("%d",minn);
    return 0;
}

发布了32 篇原创文章 · 获赞 1 · 访问量 1352

猜你喜欢

转载自blog.csdn.net/QXK_Jack/article/details/104129330