A. Pasha and Stick
一直觉得自己理科学得不好,现在才发现英语也垃圾。。。rectangle是矩形不是三角形,rectangle是矩形不是三角形,rectangle是矩形不是三角形,triangle才是三角形!!!!晕。。。
题意:
给定木棍长度n,将其切成四部分,保证每部分长度为正整数,使他们能够构成矩形且不会构成正方形。
分析:
n为奇数时无法构成矩形,n为偶数时,除去重复的和四部分相等的情况,一共有(n/2-1)/2种可能。
代码:
#include<iostream>
using namespace std;
const int INF=0x3fffffff;
int main (void)
{
long long n;
cin>>n;
if(n & 1) cout<<0<<endl;
else cout<<(n/2-1)/2<<endl;
return 0;
}
B. Vika and Squares
题意:
给定一系列数,遍历一次元素值减一,当遍历到的元素值为0时,停止遍历,求可以遍历到的元素个数的最大值。
分析:
由题意可知至少可以遍历的元素个数为 数组中的最小值*数组元素个数 再加上最小值之间的距离最大值,即为所求。因为题中说明序列循环遍历,所以计算最小值距离时要注意序列末尾与开头相连。
代码:
#include<iostream>
using namespace std;
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
typedef long long ll;
const int maxn=2000005;
const int INF=0x3fffffff;
ll a[maxn];
int main (void)
{
int n;
cin>>n;
int p = 0;
int maxs = 0;
ll mins = INF;
for(int i = 0; i < n; i++){
cin>>a[i];
a[i+n] = a[i];
mins = min(mins,a[i]);
}
for(int i = 0; i < 2 * n; i++){
if(a[i] > mins) p++;
else {
maxs = max(maxs,p);
p = 0;
}
}
cout<<n*mins+maxs<<endl;
}
C. Harmony Analysis
题意:
在 2k 维空间中找出 2k 个两两正交的由-1,1组成的单位向量。
分析:
2k∗2k=4∗2k−1∗2k−1 ,利用分治思想,最终答案的 2k∗2k 矩阵可以分为四部分,即4个 2k−1 矩阵,不停分下去直到k=1,向量正交则每次划分的四部分需满足为(1 , 1) (1,-1)。过程类似循环赛事表。
代码;
#include<iostream>
using namespace std;
const int maxn=2005;
char a[maxn][maxn];
int main (void)
{
int k;
cin>>k;
a[1][1]='+';
int n = 1<<k;
int n1 =n>>1;
for(int m = 1; m <= n1; m<<=1){
for(int i = 1; i <= m; i++){
for(int j = m+1; j <= m<<1; j++){
a[j][i] = a[i][j] = a[i][j-m];
if(a[i][j-m]=='+') a[j][i+m]='*';
else a[j][i+m]='+';
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cout<<a[i][j];
}
cout<<endl;
}
}