灵动ICPC冬令营基础-4

灵动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

输入‎

‎输入将由一行或多行组成。第一行包含三个实数和非负整数。实数按该顺序排列为 V‎‎S、R‎‎和 C。整数 n 是测试用例的数量。输入的以下 n 行每行将有一个实数。每个数字都是角度频率‎‎,w‎‎。‎

‎输出‎

‎对于输入中的每个角度频率,您将在一条线上‎‎输出其相应的‎‎V R。每个 V‎‎R‎‎值输出应在小数点之后四舍五入为三位数字。

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值