靈動ICPC冬令營基礎-4
阿新 • • 發佈:2021-01-22
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;
}