真题-桂城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
解题思路
枚举坐标。
代码
#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 就行)。
代码
#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
解题思路:枚举。
代码
#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
解题思路
判断情况(不好讲,自己看代码理解)。
代码
#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。
代码
#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}
代码
#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;
}