1. 程式人生 > 其它 >靈動ICPC冬令營基礎-4

靈動ICPC冬令營基礎-4

A - Necklace

數學題但要注意只能有唯一解,即當n=0.5時不行,又因為為整數解所以要注意上取整和下取整。

#include <cstdio>
int main()
{
	double vt, v0;
	while (~scanf("%lf%lf",&vt,&v0) && vt+v0) 
	{
		if (vt<=v0)  printf("0\n");
		else if (vt <= 2*v0)  printf("1\n");
		else 
		{
			if (0.5*vt/v0 -
(int)(0.5*vt/v0) == 0.5) printf("0\n"); else if (0.5*vt/v0 - (int)(0.5*vt/v0) < 0.5) printf("%d\n",(int)(0.5*vt/v0)); else printf("%d\n",(int)(0.5*vt/v0)+1); } } return 0; }

B - Bode Plot

高中物理數學題,算出公式直接寫就行了,就是公式不是很好算。

#include<cstdio>
#include<cmath>
int main
(){ int n; double vs,r,c,w; scanf("%lf%lf%lf%d",&vs,&r,&c,&n); while(n--) { scanf("%lf",&w); printf("%.3f\n",r*c*w*vs*sqrt(1/(r*r*c*c*w*w+1))); } return 0; }

C - Symmetric Matrix

矩陣題用陣列來做這是判斷是否為對稱矩陣,即滿足即M[i][j] !=M[N-1-i][N- 1-j] || M[I][J]<0時不成立。

#include<cstdio>
long long a[100][100];
int main(){
	int n,i,j,T,t,flag;
	while (~scanf("%d",&T)) 
	{
	   for ( t=1;t<=T;++t) 
	   {
	   		char c[5];
		    scanf("%s%s%d",c,c,&n);
		    for (i=0;i<n;++i)
		    for (j=0;j<n;++j)
			scanf("%lld",&a[i][j]);
			int flag=1;
		for (i=0;i<n;++i) 
		 	{
			for (j=0;j<n;++j)
				if (a[i][j]<0||a[i][j]!=a[n-1-i][n-1-j]) 
				{
					flag = 0;
					break;
				}
			if (flag==0) break;
		 	}
		 	printf("Test #%d: ", t);
		if (flag)  printf("Symmetric.\n");
		else printf("Non-symmetric.\n");
       }
	}
	return 0;
}

D - Homogeneous Squares

規律:對於一個n×n方陣,只要它的所有的(n-1)×(n-1)子方陣是homogeneous的,則該n×n方陣是homogeneous的;進一步遞推可得,只要該n×n方陣的所有的2*2的子方陣符合兩對角線相加相等,該該n×n方陣是homogeneous的。

#include<cstdio>
using namespace std;

int a[1005][1005];

int main()
{
    int n;
    while(~scanf("%d",&n) && n)
    {
        int flag = 1;
        for(int i = 1;i <= n;i++)
        {
            for(int j = 1;j <= n;j++)   scanf("%d",&a[i][j]);
        }

        for(int i = 1;i < n;i++)
        {
            for(int j = 1;j < n;j++)
            {
                if(a[i][j]+a[i+1][j+1] != a[i][j+1]+a[i+1][j])
                {
                    flag = 0;
                    goto there;
                }
            }
        }
        there:
        if(flag)    printf("homogeneous\n");
        else        printf("not homogeneous\n");
    }
    return 0;
}

E - To the Max

在讀取時可以用陣列讀入前i個數的和,這樣可以更容易的計算出最大的矩形域。

#include<cstdio>
#include<algorithm>
using namespace std;
const int x=-(1<<29);
int sum[101][101];
int main(){
    int n;
    scanf("%d",&n);
    int p;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=n;j++){
            scanf("%d",&p);
            sum[i][j]=sum[i][j-1]+p;
        }
    }
    int ans=x;
    for (int i=1;i<=n;i++)
	{
        for (int j=i;j<=n;j++)
		{
            int a=0;
            for (int k=1;k<=n;k++)
			{
                if(a<0) a=0;
                a+=sum[k][j]-sum[k][i-1];
                ans=max(ans,a);
            }
        }
    }
    printf("%d\n",ans);
return 0;
}

F - Who’s in the Middle

大水題,氣泡排序輸出中間的就行了。

#include<cstdio>
#include<cmath>
int a[100001];
int main(){
	int n,i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(a[j]>a[j+1])
			{
				int t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	printf("%d",a[n/2]); 
	return 0;
} 

G - Train Swapping

輸入列車的排列次序a[1]‥a[m]後,對a[ ]進行遞增排序,在排序過程中資料互換的次數即為問題解。由於m的上限僅為50,因此使用氣泡排序亦滿足時效要求。

#include<stdio.h>
int a[51];
int main(){
	int i,j,n,t,c;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&t);
		for(i=0;i<t;i++)
			scanf("%d",&a[i]);
			c=0;
		for(i=0;i<t-1;i++)
		{
			for(j=0;j<t-1-i;j++)
			{
				if(a[j]>a[j+1])	c++; 
			}
		}
		printf("Optimal train swapping takes %d swaps.\n",c);
	}
	return 0;
}

H - DNA Sorting

“最多已排序”的串指的是串中逆序對數最少的串;而串中逆序對數最多的串就是所謂的“最少已排序”的串。所以設DNA序為字串陣列s,其中第i個DNA串為s[i];逆序對數為f[i]1≤i≤m。
首先,使用氣泡排序,統計每個DNA串的逆序對數f[i];然後使
用插入排序,按逆序對數遞增排序s;最後,輸出s[1]‥s[m]。

#include<cstdio>
#include<cstring>
struct dna {
	int s;
	char c[1001];
};
dna d[1001];
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++)
	{
		scanf("%s",d[i].c);
		d[i].s=0;
		for(int j=0;j<n;j++)
		{
			for(int k=j;k<=n;k++)
			if(d[i].c[j]>d[i].c[k])
				d[i].s++;
		}
	}
	for(int i=0;i<m-1;i++)
		{
			for(int j=0;j<m-1-i;j++)
			{
				if(d[j].s>d[j+1].s)
				{
					dna t=d[j];
					d[j]=d[j+1];
					d[j+1]=t;
				}
			}
		}
	for(int i=0;i<m;i++)
		printf("%s\n",d[i].c);
	return 0;
}