XDOJ—3,27,70,73—最小差值,阶梯电价计费,Z字形扫描,字符串压缩
2019.12.29日
最小差值
问题描述
给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
输入格式
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分隔。
输出格式
输出一个整数,表示答案。
样例输入
5
1 5 4 8 20
样例输出
1
样例说明
相差最小的两个数是5和4,它们之间的差值是1。
样例输入
5
9 3 6 1 3
样例输出
0
样例说明
有两个相同的数3,它们之间的差值是0.
数据规模和约定
对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。
#include<stdio.h>
#include<math.h>
int abs(int a,int b)
{
int c;
if(a>b)
c=a-b;
else
c=b-a;
return c;
}
int main()
{
int n,i,j,b=10000;
int a[100];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if((abs(a[i],a[j]))<b&&(i!=j))
{
b=abs(a[i],a[j]);
}
}
printf("%d",b);
return 0;
}
阶梯电价计费
类别:流程控制
时间限制:2S
内存限制:10000Kb
问题描述:
电价分三个档次,[0,110]度电,每度电0.5元;(110,210]度电,超出110部分每度电0.55元,超过210度电,超出210部分每度电0.70元,给出一个家庭一月用电量,请计算出应缴的电费(四舍五入,保留小数点后两位小数)。
输入说明:
输入数据为一个正实数,表示一月用电量
输出说明:
输出应缴电费,四舍五入保留2位小数。
输入样例:
输入样例1
100
输入样例2
200
输入样例3
329.75
输出样例:
输出样例1
50.00
输出样例2
104.50
输出样例3
193.82
#include<stdio.h>
int main()
{
double a;
double b;
scanf("%lf",&a);
if(a<=110)
b=a*0.5;
else if(a<=210)
b=110*0.5+(a-110)*0.55;
else
b=110*0.5+100*0.55+(a-210)*0.7;
printf("%.2f",b);
}
Z字形扫描
类别
数组
时间限制
1S
内存限制
256Kb
问题描述
在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个m×n的矩阵,Z字形扫描的过程如下图所示。
对于下面给出的4×4的矩阵:
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
对其进行Z字形扫描后得到长度为16的序列如下所示:
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。
输入说明
数据的第一行为整数n(n<100),表示矩阵的行和列数;接下来的n行数据,每行分别为n个整数值(每个整数值都不超过1000),即矩阵的值
输出说明
在一行上输出Z字形扫描得到的整数序列,整数之间用空格分隔
输入样例
4
1 5 3 9
3 7 5 6
9 4 6 4
7 3 1 3
输出样例
1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
没写出来,查找:
#include<stdio.h>
#include<stdlib.h>
#define RIGHT 1
#define DOWN 2
#define LEFTDOWN 3
#define RIGHTUP 4
int main()
{
int row,col;
int n=0;
int **array;
scanf("%d",&n);
if(n<1 || n>500)
{
return 0;
}
array=(int**)malloc(sizeof(int*)*(n+1));
int i;
for(i=1;i<=n;i++)
{
array[i]=(int*)malloc(sizeof(int)*(n+1));
}
for(row=1;row<=n;row++)
{
for(col=1;col<=n;col++)
{
scanf("%d",&array[row][col]);
if(array[row][col]<0 || array[row][col]>1000)
{
return 0;
}
}
}
row=1;
col=1;
int direction=0;
int *resultArray;
resultArray=(int*)malloc(sizeof(int)*n*n);
int a;
resultArray[0]=array[row][col];
for(a=1;a<n*n && !(row==n && col==n);a++)
{
if(direction==0)
{
direction=RIGHT;
}
else if(direction==RIGHT)
{
if(row+1<=n && col-1>=1)
{
direction=LEFTDOWN;
}
else
{
direction=RIGHTUP;
}
}
else if(direction==LEFTDOWN)
{
if(row+1<=n && col-1>=1)
{
direction=LEFTDOWN;
}
else if(row+1<=n)
{
direction=DOWN;
}
else
{
direction=RIGHT;
}
}
else if(direction==RIGHTUP)
{
if(row-1>=1 && col+1<=n)
{
direction=RIGHTUP;
}
else if(col+1<=n)
{
direction=RIGHT;
}
else
{
direction=DOWN;
}
}
else
{
if(row+1<=n && col-1>=1)
{
direction=LEFTDOWN;
}
else
{
direction=RIGHTUP;
}
}
if(direction==RIGHT)
{
++col;
}
else if(direction==DOWN)
{
++row;
}
else if(direction==LEFTDOWN)
{
++row;
--col;
}
else
{
--row;
++col;
}
resultArray[a]=array[row][col];
}
for(a=0;a<n*n;a++)
{
printf("%d ",resultArray[a]);
}
free(resultArray);
int j;
for(j=1;j<=n;j++)
{
free(array[j]);
}
free(array);
return 0;
}
字符串压缩
类别
字符串处理
时间限制
1S
内存限制
1000Kb
问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。
输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串
输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。
输入样例
a5b3aba13b4
输出样例
aaaaabbbabaaaaaaaaaaaaabbbb
没写出来,查找:
#include<stdio.h>
int main()
{
char str[256],str1[256];
int i,j,k,n;
gets(str);
i=j=0;
while ( str[i] )
{
str1[j]=str[i];
j++;
i++;
n=0;
while(str[i]>='0'&&str[i]<='9')
{
n*=10;
n+=str[i]-'0';
i++;
}
for(k=0;k<n-1;k++)
str1[j+k]=str1[j-1];
if(n>0)
j+=n-1;
}
str1[j]=0;
printf("%s\n",str1);
}