灵动ICPC冬令营基础-4
A - Necklace
• 输入
• 输入的每行包含两个数字,Vtotal(0< Vtotal≤60000)和V0 (0< V0 ≤600),含义如上所述。输入以Vtotal = V0 =0结束。
• 输出
• 输出的每行给出可以制作圆环的数量,使得形成的项链是最长的。 如果这一数字不唯一,或者根本无法形成项链,则输出“0”。
#include<stdio.h>
int main(){
double v1,v2,n;
int n1;
while(~scanf("%lf%lf",&v1,&v2)&&v1+v2!=0){
n=0.5*v1/v2;
n1=int(0.5*v1/v2);
if(n<=0||v1<v2)
{
printf("0\n");
}
else{
if(n-n1<0.5) printf("%d\n",n1);
else if(n-n1==0.5) printf("0\n");
else printf("%d\n",n1+1);
}
}
return 0;
}
B - Bode Plot
输入
输入将由一行或多行组成。第一行包含三个实数和非负整数。实数按该顺序排列为 VS、R和 C。整数 n 是测试用例的数量。输入的以下 n 行每行将有一个实数。每个数字都是角度频率,w。
输出
对于输入中的每个角度频率,您将在一条线上输出其相应的V R。每个 VR值输出应在小数点之后四舍五入为三位数字。
#include<stdio.h>
#include<math.h>
int main(){
double s,r,c,n,w,v;
scanf("%lf%lf%lf%lf",&s,&r,&c,&n);
while(n--){
scanf("%lf",&w);
v=r*c*w*s*sqrt((1/(r*r*c*c*w*w+1)));
printf("%.3lf\n",v);
}
return 0;
}
C - Symmetric Matrix
• 输入
• 输入的第一行给出测试用例数T≤300。接下来的T个测试用例按照 以下方式给出。每个测试用例的第一行给出n,方阵的维数;然 后给出n行,每行相应于矩阵的一行,包含n个由空格字符分隔的 元素。第i行的第j个数就是矩阵的元素Mij。
• 输出
• 对于每个测试用例,输出一行“Test #t: S”,其中t是从1开始的 测试用例的编号,如果矩阵是对称的,则S是“Symmetric”;否 则,就是“Non-symmetric”。
#include<cstdio>
#define N 10007
long long a[N][N];
int main(){
int n,t,i,j,b=0,c=1;
scanf("%d",&t);
while(t--)
{
getchar( );
scanf("N = %d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
scanf("%lld",&a[i][j]);
}
}
b=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++){
if(a[i][j]<0||a[i][j]!=a[n+1-i][n+1-j]) {
b=1 ;
break;
}
}
if(b==1) break;
}
if(b==1) printf("Test #%d: Non-symmetric.\n",c);
else printf("Test #%d: Symmetric.\n",c);
c++;
}
return 0;
}
D - Homogeneous Squares
• 假设您有一个大小为n的正方形,它被划分出n×n个位置,就像 一个棋盘。如果存在两个位置(x1 , y1 )和(x2 , y2 ),其中 1≤ x1 , y1 , x2 , y2 ≤n,这两个位置占据不同的行和列,即x1 ≠ x2 并 且 y1 ≠ y2 ,则称两个位置是“独立的”。更一般地说,如果n个位 置两两间是独立的,则称这n个位置是独立的。因此有n!种不同的 选法选择n个独立的位置。
• 设定在这样一个n×n的正方形的每个位置上都写有一个数。如果 不管位置如何选择,写在n个独立位置上的数的和相等,这个正 方形称为“homogeneous”。请您编写一个程序来确定一个给出 的正方形是否是“homogeneous”的。
#include<cstdio>
#define N 1007
int a[N][N];
int main(){
int n,i,j,t;
while(~scanf("%d",&n)&&n){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) scanf("%lld",&a[i][j]);t=1;
for(i=1;i<n;i++){
for(j=1;j<n;j++){
if(a[i][j]+a[i+1][j+1]!=a[i][j+1]+a[i+1][j]) {
t=0;
break;
}
}
if(t==0) break;
}
if(t==1) printf("homogeneous\n");
else printf("not homogeneous\n");
}
return 0;
}
E - To the Max
• 给出一个由正整数和负整数组成的二维数组,一个子矩形是指位于整 个数组中大小为1*1或更大的任何连续子数组。矩形的和是该矩形中所 有元素的和。在本题中,具有最大和的子矩形被称为最大子矩形。
• 例如,给出一个二维数组如下:
• 0 -2 -7 0
• 9 2 -6 2
• -4 1 -4 1
• -1 8 0 -2
• 最大子矩形是在左下角:
• 9 2
• -4 1
• -1 8
• 矩形的和是15。
F - Who’s in the Middle
• FJ调查他的奶牛群,他要找到最一般的奶牛,看最 一般的奶牛产多少牛奶:一半的奶牛产奶量大于或 等于这头奶牛,另一半的奶牛产奶量小于或等于这 头奶牛。
•给出奶牛的数量:奇数N (1≤N<10,000)及其产奶量 (1…1,000,000),找出位于产奶量中点的奶牛,要求 一半的奶牛产奶量大于或等于这头奶牛,另一半的 奶牛产奶量小于或等于这头奶牛。
• 输入
• 第1行: 整数N
• 第2行到第N+1行:每行给出一个整数,表示一头奶牛的产奶量。
• 输出
• 一个整数,位于中点的产奶量。
#include<stdio.h>
#define N 10007
int main(){
int n,i,j,t;
scanf("%d",&n);
int a[N];
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++){
for(j=1+i;j<=n;j++){
if(a[i]>a[j]){
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
t=(n+1)/2;
printf("%d",a[t]);
}
G - Train Swapping
• 输入
• 输入的第一行给出测试用例的数目(N)。每个测试用例有两行, 第一行给出整数L,表示列车车厢的数量(0≤L≤50),第二行给出一 个从1到L的排列,给出车厢的当前排列次序。要按数字的升序重 新排列这些车厢:先是1,再是2,等等,最后是L。
• 输出
• 对每个测试用例输出一句句子:‘Optimal train swapping takes S swaps.’,其中S是一个整数。
#include<stdio.h>
#define N 10007
int main(){
int a[N],i,j,n,t,x=0,y=0;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
y=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
for(j=1+i;j<=n;j++)
{
if(a[i]>a[j])
{
x=a[i];
a[i]=a[j];
a[j]=x;
y++;
}
}
}
printf("Optimal train swapping takes %d swaps.\n",y);
}
}
H - DNA Sorting
•在一个字符串中逆序数是在该串中与次序相反的字 符对的数目。例如,字母序列“DAABEC”的逆序数 是5,因为D比它右边的4个字母大,而E比它右边 的1个字母大。序列“AACEDGG”的逆序数是1(E和 D),几乎已经排好序了。而序列“ZWQM”的逆序 数是6,完全没有排好序。
•您要对DNA字符串序列进行分类(序列仅包含4个 字母A,C,G和T)。然而,分类不是按字母顺序, 而是按“排序”的次序,从“最多已排序”到“最少已 排序”进行排列。所有的字符串长度相同。
#include<cstdio>
struct p{
char a[101];
int c;
}d[101];
void swap(struct p *a, struct p *b){
struct p temp = *a;
*a = *b;
*b = temp;
}
int main(){
int m,n,i,j,k;
scanf("%d%d",&n,&m);
for( i = 0 ; i < m ; i++){
scanf("%s",d[i].a);
}
for( k=0;k<m;k++){
for ( i = 0; i < n-1 ; i++){
for ( j = i+1; j < n ; j++){
if (d[k].a[i] > d[k].a[j]) d[k].c++;
}
}
}
for ( i = 0; i < m - 1; i++){
for ( j = 0; j < m - 1 - i; j++){
if (d[j].c > d[j + 1].c) swap(&d[j], &d[j+1]);
}
}
for(int i = 0 ; i < m ; i++){
printf("%s\n",d[i].a);
}
return 0;
}