真题-桂城2018年六年级

01.整点

题目描述

在二维坐标系, 有一个圆,圆心在(0,0),圆的半径是r。问圆内有多少个整点(所谓的整点就是横坐标和纵坐标都是整数的点)。

若点P的横坐标是整数a,纵坐标是整数b,那么只要满足aa + bb <= r*r, 那么P就是圆内的整点。

输入格式

多组测试数据。 第一行,一个整数G,表示有G组测试数据。1 <= G <= 10。

每组测试数据格式:

一个整数r。 1<=r<=100。

输出格式

共G行,每行一个整数。

样例

输入数据 1

5
1
2
3
47
96

输出数据 1

4
12
28
6920
28916

解题思路

枚举坐标。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,r,ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	ans=0;
        cin>>r;
        for(int i=-r;i<=r;i++)
        {
            for(int j=-r;j<=r;j++)
            {
                if(i*i+j*j<=r*r)ans++;
            }
        }
		cout<<ans-1<<endl;
    }
    return 0;
}

02.按钮

题目描述

对于给出的正整数a, 有两个按钮, 每次点击第1个按钮可以使得a减少2, 每次点击第2个按钮可以使得a的值增加3. 你的目标是使得a变成b, 求最少的点击次数,如果无法完成任务输出-1。

输入格式

多组测试数据。

第一行,一个整数G,表示有G组测试数据。1 <= G <= 5。

每组测试数据格式:

一行,两个整数a,b。 1<=a,b<=100。

输出格式

共G行,每行一个整数。

样例

输入数据 1

3
10 14
23 23
3 97

输出数据 1

3
0
33

解题思路

首先,如果一开始 a 就等于 b ,那么可以直接输出 0 。接下来处理 a 小于 b 的情况,差大于 3 的情况可以直接加,那么就是 (b-a)/3 次,减 2 再加 3 就等于加 1,那么再把剩下的数多少个加 1 就行,那么就要加 (b-a)%3*2 次。最后处理 a 大于 b 的情况,差大于 2 的情况可以直接减,那么就是 (a-b)/2 次,减 2 减 2 再加 3 就是减 1 ,那么再把剩下的数多少个加 1 就行,那么就要加 (a-b)%2*3次(由于一个数 mod 2 要么是1,要么是0,所以判断一下,加 3 就行)。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int g;
int main(){
    cin>>g;
    while(g--)
    {
        int a,b;
        cin>>a>>b;
        if(a==b)
        {
            cout<<0<<endl;
            continue;
        }
        if(b>a){
            int c=b-a;
            int s=c/3;
            if(c%3!=0) s+=(c%3)*2;
            cout<<s<<endl;
        }
        else
        {
            int c=a-b;
            int s=c/2;
            if(c%2!=0)s+=3;
            cout<<s<<endl;
        }
    }
    
    return 0;
}

03.字典序

题目描述

有一个字符串 S ,S 的每个字符都是小写字母。

有 N 个贴纸,第 i 个贴纸上面印有一个字符 ch[i] 。使用 1 个贴纸可以替代 S 的 1 个字符。

例如你可以使用第 i 个贴纸去替代 S 的第 j 个字符,即把 S[j] 替换成 ch[i] 。

注意:贴纸只能用来替换 S 的字符,贴纸不能增加或减少 S 的长度。你的目标是使得 S 的字典序最大,输出能得到的字典序最大是 S 。

输入格式

多组测试数据。

第一行,一个整数 G,表示有 G 组测试数据 ( 1 <= G <= 10 )。

每组测试数据格式:

第一行,一个字符串 S ,S 的长度不超过 50 。

第二行,一个整数 N ( 1 <= N <= 50 )。

第三行,N 个字符,第 i 个字符是 ch[i] 。

输出格式

共 G 行,每行一个字符串。

样例

输入数据 1

2
aaaaa
5
zzzzz
xx
2
yz

输出数据 1

zzzzz
zy

解题思路:枚举。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int g;
int main(){
    cin>>g;
    while(g--)
    {
        string s;
        int n;
        char ch[55];
        cin>>s>>n;
        for(int i=1;i<=n;i++) cin>>ch[i];
        sort(ch+1,ch+n+1);
        for(int i=n;i>=1;i--)
        {
            for(int j=0;j<s.size();j++)
            {
                if(ch[i]>s[j]) 
                {
                    s[j]=ch[i];
                    break;
                }
            }
        }
        cout<<s<<endl;
    }
    return 0;
}

04.独居

题目描述

一只奶牛自己独居,它每天需要吃1个水果和花费X元交暖气费。现在奶牛家里有F个水果和D元。奶牛最多能独居多少天?奶牛可以去超市买水果,超市每个水果P元。

输入格式

多组测试数据。

第一行,一个整数G,表示有G组测试数据。1 <= G <= 10。

每组测试数据格式:

一行,4个整数X,F,D,P。 1<=X,F,D,P<=2000000000。

输出格式

共G行,每行一个整数。

样例

输入数据 1

10
3 5 100 10
2 17 20 1
1 97 98 1
16 4 8 2
17 1 2000000000 4
1 1996245611 1999990159 123
15000000 100 2000000000 1
1 1000000000 2000000000 1000000000
1 1 1 1
1 1 1 2000000000

输出数据 1

11
10
97
0
95238095
1996275808
133
1000000000
1
1

解题思路

判断情况(不好讲,自己看代码理解)。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int g;
int main()
{
	cin>>g;
	for(int i=1;i<=g;i++)
	{
        int x,f,d,p,ans=0,s,t,k;
		cin>>x>>f>>d>>p;
		s=d/x;
		if(s==0)
        {
            ans=0;
        }
		if(s<=f)
        {
            ans=s;
        }
		if(s>f)
		{
			d=d-x*f;
		    t=x+p;
		    k=d/t;
		    ans=f+k;
		}
		cout<<ans<<endl;
	} 
	return 0;
}

05.魔术数

题目描述

X是一个正整数,它的第i个数字是d[i],则 序列(d [1],d[2],d[3],...,d[t])是X 的数字表示(没有前导零)。特别地,d[1]是最高位数字并且d[t]是X的最低位数字。例如,X = 576的数字表示是(5,7,6)。我们说整数X是魔术数,当且仅当:

1、X是某个整数的平方,即对于某个整数Y ,X = Y * Y。

2、对于X 的数字表示(d[1],d[2],d[3],...,d[t]),它满足d[1] < d[2] > d[3] < d[4]......,依此类推。也就是说,对于每个奇数下标i < t,满足d[i] < d[i+1],并且对于每个偶数下标i < t,它满足d[i] > d[i+1]。

给定A和B,输出A和B之间有多少魔术数。

输入格式

多组测试数据。 第一行,一个整数G,表示有G组测试数据。1 <= G <= 10。

每组测试数据格式:

一行,两个整数A和B。 1 <= B <= 10^10。 1 <= A <= B 。

输出格式

共G行,每行一个整数。

样例

输入数据 1

3
1 64
50 60
121 121

输出数据 1

7
0
1

解题思路

枚举即可。注意:题目中说X=Y*Y,为了防止程序超时,需要枚举Y。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
long long g,a,b;
int main(){
	cin>>g;
	while(g--)
	{
		cin>>a>>b;
		long long ans=0;
		for(long long i=ceil(sqrt(a));i<=floor(sqrt(b));i++)
		{
			if(i*i>b)
            {
                break;
            }
			long long s=i*i,l=0,c1[12],c[12];
			while(s)
			{
				c1[++l]=s%10;
				s=s/10;
			}
			for(long long j=1,k=l;j<=l;j++,k--)
            {
                c[j]=c1[k];
			}
			int p=0;
			for(long long j=1;j<l;j++)
			{
				if(j%2==1)
                {
                    if(c[j]>=c[j+1])
                    {
                        p=1;
                    }
                }
				if(j%2==0)
                {
                    if(c[j]<=c[j+1])
                    {
                        p=1;
                    }
                }
			}
			if(p==0)ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

06.存在

题目描述

给出一个B数组B[0...n-1]。你要寻找另一个数组A[0...n-1],使得A数组同时满足如下条件:

1、对于0<=i<n, A[i]必须是2^j,其中j是正整数。即A[i]必须是2,4,8,16,32,64...等这样的数。

2、对于0<=i<n, A[i]^B[i]必须能整除P, 其中P=A[0] * A[1] * A[2] * ...A[n-1]。

注意:对于本题,^都是表示幂,也就是多少次方,例如:2^3表示2的3次方,故2^3=8。

如果你能找到这样满足上面要求的A数组,那么输出"Possible",或者输出"Impossible",双引号不用输出。

输入格式

多组测试数据。 第一行,一个整数G,表示有G组测试数据。1 <= G <= 13。

每组测试数据格式:

  • 第一行,一个整数n。 1 <= n <= 50。
  • 第二行,n个整数,第i个整数是B[i]。 1 <= B[i] <= 10。

输出格式

共G行,每行一个字符串,"Possible"或者"Impossible",双引号不用输出。

样例

输入数据 1

4
2
3 2 
3
3 3 3
2
1 10 
3
2 3 10

输出数据 1

Possible
Possible
Impossible
Possible

样例解释

第一组测试数据:A[] = {2,2}

第二组测试数据:A[] = {2,2,2}

第四组测试数据:A[] = {8,4,2}

代码

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
	int g;
	cin >> g;
	while (g--)
	{
		int n;
		cin >> n;
		int b[55];
		double k[55];
		double sum = 0;
		for (int i = 1; i <= n; i++)
		{
			cin >> b[i];
			k[i] = 640.0 / b[i];
			sum += k[i];
		}
		int flag = 1;
		for (int i = 1; i <= n; i++)
			if (b[i]*k[i] < sum)flag = 0;
		if (flag == 1)cout << "Possible"<<endl;
		else cout << "Impossible"<<endl;
	} 
	return 0;
}