问题描述
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0 给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
输出格式
输出一行包含一个整数,表示答案。
样例输入
5
1 2 5 3 5
样例输出
2
样例说明
a[2] 和 a[4] 可能是三元组的中心。
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
#include
using namespace std;
const int N=1000;
int main()
{
int a[N],n,i,sum=0,j,k;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n-2;i++)
{
for(j=i+1;j<n-1;j++)
{
for(k=j+1;k<n;k++)
{
if(a[i]<a[j] && a[j]<a[k])
{
sum++;
a[j]=0;
break;
}
}
}
}
cout<<sum<<endl;
return 0;
}
问题描述
给定两个正整数 n 和 m,请问在整数 1 至 n 中,各位数字的平方和为 m 的总共有多少个?
例如,当 n=100,m=5 时,只有 12 和 21 各位数字的平方之和为 5,所以答案为 2。
输入格式
输入的第一行包含两个整数 n 和 m,用一个空格分隔。
输出格式
输出一行包含一个整数,表示答案。
样例输入
100 5
样例输出
2
评测用例规模与约定
对于 40% 的评测用例,1 <= n <= 1000,1 <= m <= 1000。
对于所有评测用例,1 <= n <= 1000000,1 <= m <= 1000。
#include
using namespace std;
int main()
{
int n,m,num=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int a=i,r=0;
while(a)
{
r+=(a%10)*(a%10);
a/=10;
}
if(r==m)num++;
}
cout<<num<<endl;
return 0;
}
问题描述
一般情况下,如果一个单词在段首,则第一个字母大写,后面的字母小写。
给定一个单词,单词中可能包含大小写字母,请按第一个字母大写,后面字母小写的方式输出。
输入格式
输入一行,包含一个单词,单词中只包含大写或小写英文字母。
输出格式
输出单词在段首时的形式,第一个字母大写,其他字母小写。
样例输入
LanQiao
样例输出
Lanqiao
样例输入
cUp
样例输出
Cup
评测用例规模与约定
#include
#include
#include
using namespace std;
int main(){
char c[100];
while(gets(c)){
int num=strlen(c);
//注意非字母的特殊处理
if(c[0]>='a'&&c[0]<='z')
cout<<(char)('A'-'a'+c[0]);
else
cout<<c[0];
for(int i=1;i<num;i++){
if(c[i]>='A'&&c[i]<='Z'){
cout<<(char)(c[i]-'A'+'a');
}
else
cout<<c[i];
}
cout<<endl;
}
}
问题描述
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
输入格式
输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。
第二行包含两个整数 r, c,表示要求的行号和列号。
输出格式
输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
样例输入
4 5
2 2
样例输出
15
评测用例规模与约定
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。
#include
using namespace std;
int main() {
int m, n, t = 0;
cin>>m>>n;
vector<int> a(m*n);
for (int i = 1; i <= m*n; i++)
a[i-1]=i;
vector<vector<int> > b(m, vector<int>(n));
int level = m / 2 + m % 2;
for (int i = 0; i < level; i++)
{
for (int j = i; j <= n - 1 - i && t <= m*n - 1; j++)
b[i][j] = a[t++];
for (int j = i + 1; j <= m - 2 - i && t <= m*n - 1; j++)
b[j][n - 1 - i] = a[t++];
for (int j = n - i - 1; j >= i && t <= m*n - 1; j--)
b[m - 1 - i][j] = a[t++];
for (int j = m - 2 - i; j >= i + 1 && t <= m*n - 1; j--)
b[j][i] = a[t++];
}
int xx,yy;
cin>>xx>>yy;
cout<<b[xx-1][yy-1]<<endl;
return 0;
}
问题描述
给定一个序列 a_1, a_2, …, a_n。其中 a_1 是最大的数,没有其他数与 a_1 相等。
对于从第二个数开始的每个数 a_i,请找到位置在 a_i 之前且比 a_i 大的,位置上距离 a_i 最近的数 a_j。称 i-j 为 a_i 的前向距离。
对于给定的序列,请求出所有数的前向距离之和。
输入格式
输入的第一行包含一个整数 n,表示序列的长度。
第二行包含 n 个正整数,为给定的序列。
输出格式
输出一个整数,表示序列中所有数的前向距离之和。
样例输入
8
9 1 3 5 2 7 6 3
样例输出
14
样例说明
序列中从第二项开始的前向距离依次为:
1, 2, 3, 1, 5, 1, 1
和为14。
数据规模和约定
对于70%的评测用例,1 <= n <= 1000;
对于所有评测用例,1 <= n <= 100000,a_1 <= 1000000。
请注意答案可能很大,可能需要使用 long long 来保存。
#include
#include
#include
#include
using namespace std;
typedef long long int ll;
struct point{
ll a;
ll g;
} p[100005];
int main()
{
stack<ll> s;
ll n,d[100005],ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].a;
d[p[i].a]=i;
p[i].g=1;
if(s.empty()||p[i].a<s.top())
{
s.push(p[i].a);
}
while(p[i].a>s.top())
{
p[i].g+=p[d[s.top()]].g;
s.pop();
}
if(p[i].a<s.top()) s.push(p[i].a);
ans+=p[i].g;
}
cout<<ans-1;
return 0;
}
问题描述
小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n 个。他们准备把自己带的树苗都植下去。
然而,他们遇到了一个困难:有的树苗比较大,而有的位置挨太近,导致两棵树植下去后会撞在一起。
他们将树看成一个圆,圆心在他们找的位置上。如果两棵树对应的圆相交,这两棵树就不适合同时植下(相切不受影响),称为两棵树冲突。
小明和朋友们决定先合计合计,只将其中的一部分树植下去,保证没有互相冲突的树。他们同时希望这些树所能覆盖的面积和(圆面积和)最大。
输入格式
输入的第一行包含一个整数 n ,表示人数,即准备植树的位置数。
接下来 n 行,每行三个整数 x, y, r,表示一棵树在空地上的横、纵坐标和半径。
输出格式
输出一行包含一个整数,表示在不冲突下可以植树的面积和。由于每棵树的面积都是圆周率的整数倍,请输出答案除以圆周率后的值(应当是一个整数)。
样例输入
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
样例输出
12
评测用例规模与约定
对于 30% 的评测用例,1 <= n <= 10;
对于 60% 的评测用例,1 <= n <= 20;
对于所有评测用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。
//题解
//考虑DFS+回溯做法。
//枚举出长度为 n{n}n 的二进制01串,第 i{i}i 位上的二进制位代表其是否种植。逐一统计出可种植的情况,并以此维护种植面积的最大值即可。
#include
#include
#include
#include
#include
/*
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
*/
using namespace std;
const int MAXN = 1000 + 10;
int n;
int x[MAXN], y[MAXN], r[MAXN];
double pi = acos(-1);
bool vis[MAXN];
int ans = 0;
bool cal(int i)
{
for(int j = 0; j < n; j ++)
{
if(i != j && vis[j])
{
int dis = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
if(dis < (r[i] + r[j]) * (r[i] + r[j])) return false;
}
}
return true;
}
void dfs(int step, int sum)
{
if(step == n)
{
ans = max(ans, sum);
return;
}
for(int i = 0; i < n; i ++)
{
if(!vis[i])
{
int tmp = r[i];
if(!cal(i)) r[i] = 0;
vis[i] = true;
dfs(step + 1, sum + r[i] * r[i]);
vis[i] = false;
r[i] = tmp;
}
}
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i ++)
scanf("%d%d%d", &x[i], &y[i], &r[i]);
dfs(0, 0);
printf("%d", ans);
return 0;
}