一.卖菜问题
问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜。 输入格式 输入的第一行包含一个整数n,表示商店的数量。 输出格式 输出一行,包含n个正整数,依次表示每个商店第二天的菜价。 样例输入 8 样例输出 2 2 1 3 4 9 10 13 数据规模和约定 对于所有评测用例,2 ≤ n ≤ 1000,第一天每个商店的菜价为不超过10000的正整数。 |
这一题较简单。主要就是注意一些细节问题。当是第一个和最后一个元素时,只有一个相邻元素,所以这种情况就求它和它相邻元素的平均值即可。其余情况就是三个数(它和它左右元素)求平均。下面是具体代码:
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
int b[n];
for(int i=0;i<n;i++){
a[i]=0;
b[i]=0;
}
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
if(i==0){
b[i]=(a[i]+a[i+1])/2;
}else if(i==n-1){
b[i]=(a[i]+a[i-1])/2;
}else{
b[i]=(a[i-1]+a[i]+a[i+1])/3;
}
}
for(int i=0;i<n;i++){
if(i==0){
printf("%d",b[i]);
}else if(i==n-1){
printf(" %d\n",b[i]);
}else{
printf(" %d",b[i]);
}
}
return 0;
}
二.买菜问题
问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装n次车。具体的,对于小H来说有n个不相交的时间段[a1,b1],[a2,b2]...[an,bn]在装车,对于小W来说有n个不相交的时间段[c1,d1],[c2,d2]...[cn,dn]在装车。其中,一个时间段[s, t]表示的是从时刻s到时刻t这段时间,时长为t-s。 输入格式 输入的第一行包含一个正整数n,表示时间段的数量。 输出格式 输出一行,一个正整数,表示两人可以聊多长时间。 样例输入 4 样例输出 3 数据规模和约定 对于所有的评测用例,1 ≤ n ≤ 2000, ai < bi < ai+1,ci < di < ci+1,对于所有的i(1 ≤ i ≤ n)有,1 ≤ ai, bi, ci, di ≤ 1000000。 |
我认为这道题主要的难点就是对相交情况的分类。最初我就将情况划分为了4类。但由于对等于情况的归类不当(只在第一种情况中包含了a=c,b=d的情况),导致只得了20分,后来经过思考发现这样分类缺少了一些情况(如a=c,d<b和b=d,c<a),所以在第三种情况中也加入了等于,然后就过了。在考虑分类的时候一定要细致,考虑到多种特殊情况和临界情况。分类如下:
(1) a<=c<b<=d
(2)a<c<d<b
(3)c<=a<d<=b
(4)c<a<b<d
具体代码如下:
#include<stdio.h>
int main(){
int n;
int total=0;
scanf("%d",&n);
int a[n],b[n],c[n],d[n];
for(int i=0;i<n;i++){
a[i]=b[i]=c[i]=d[i]=0;
}
for(int i=0;i<2*n;i++){
if(i<n) scanf("%d%d",&a[i],&b[i]);
else scanf("%d%d",&c[i-n],&d[i-n]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i]<=c[j]&&b[i]<=d[j]&&b[i]>c[j]) total+=b[i]-c[j];
else if(a[i]<c[j]&&b[i]>d[j]) total+=d[j]-c[j];
else if(a[i]>=c[j]&&b[i]>=d[j]&&a[i]<d[j]) total+=d[j]-a[i];
else if(a[i]>c[j]&&b[i]<d[j]) total+=b[i]-a[i];
else total=total;
}
}
printf("%d\n",total);
return 0;
}