20200328上记笔记

7-1 括号匹配检测 (100分)

给出一串包含 ( 、 ) 、[ 和 ] 的字符串,字符串在以下三种情况下为合法的:

1)字符串为空;

2)如果A和B都是合法的,那么AB也是合法的;

3)如果A是合法的,那么(A)和[A]也是合法的。

试判断输入的字符串是否合法。

输入格式:
输入包括一串由若干个 ( 、 ) 、 [ 或 ] 组成的字符串,字符串长度不超过100。

输出格式:
如果该字符串合法,输出“Yes”;否则输出“No”。

输入样例:

([])

输出样例:

Yes

#include<stdio.h>
#include<string.h>
char s[107],c[107];
int flag;
int main(){
	scanf("%s",s);
	int i,j=0,k;
	int len=strlen(s);
	for(i=0;i<len;i++){
		if(s[i]=='('||s[i]=='['){
			c[++j]=s[i];
		}
		if(s[i]==')'){
			if(c[j]=='('){
				j--;
			}
			else {
				flag=1;break;
			}
		}
		if(s[i]==']'){
			if(c[j]=='['){
				j--;
			}
			else {
				flag=1;break;
			}
		}
	}
	if (flag==0){
		if(j==0){
			printf("Yes");
		}
		else {
			printf("No");
		}
	}
	else {
		printf("No");
	}
	return 0;
} 

7-2 选座位 (90分)

已知公交车中有n排座位,每排都有2个座位。第i排的两个座位的宽度均为wi厘米。没有相同宽度的两排座位。

公共汽车最初是空的。有2n位乘客按顺序先后进入公共汽车。 乘客分为两种类型:

内向者:总是选择两个座位都没人的一排。在这些排中,他选择座位宽度最小的,并占据了其中的一个座位; 外向型:总是选择有人的一排。 在这些排中,他选择座位宽度最大的那个,并占据了空位。

你会得到每排座位的宽度和乘客进入公共汽车的顺序。 请你帮忙确定每位乘客将乘坐哪一排座位。

输入格式:
第一行包含一个整数n(1 ≤ n ≤ 200),表示公共汽车上座位的总排数。

第二行是一个包含n个整数的序列w 1,w 2,...,w n(1 ≤ w i ≤ 10000),其中wi是第i行中每个座位的宽度。 保证所有 w i 都不同。

第三行包含一个长度为 2n 的字符串,由数字“0”和“1”组成,该字符串描述了乘客进入公共汽车的顺序。 如果第j个字符是 '0',那么说明第 j 个进入公共汽车的乘客是内向型的;如果第j个字符是 '1',则表示第j个进入公交车的乘客是外向型的。 保证外向者的数量等于内向者的数量(即'0'和'1'的个数均为 n),并且对于每个外向者总是有合适的行。

输出格式:
打印 2n 个整数,整数之间以空格分隔,表示乘客将坐的排。 乘客的顺序应与输入的顺序相同。

输入样例1:

2
3 1
0011

输出样例1:

2 1 1 2

输入样例2:

6
10 8 9 11 13 5
010010011101

输出样例2:

6 6 2 3 3 1 4 4 1 2 5 5

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
typedef struct{
	int w;//宽度 
	int i;//列数 
}a;
int cmp(a *pa,a *pb){
	a aa=*pa;
	a bb=*pb;
	if(aa.w<bb.w)return -1;
	else return 1;
}
a sat[201]; 
int main(){
	scanf("%d",&n);
	int j,k;
	int t=2*n;
	for (j=0;j<n;j++){
		scanf("%d",&sat[j].w);
		sat[j].i=j+1;
	}
	char s[401];
	scanf("%s",s);
	int len=strlen(s);
	qsort(sat,n,sizeof(sat[0]),cmp);
	int w1[401],w2[401],book[401]={0};
	int head=0,rear=n-1;
	for (j=0;j<len;j++){
		if (s[j]=='0'&&book[head]<=2){
			book[head]++;
			w2[j]=sat[head].i;
			head++;
		}
		if (s[j]=='1'){
			t=head-1;
			while(book[t]>=2){
				t--;
			}
			book[t]++;
			w2[j]=sat[t].i;
		} 
	}
	for (k=0;k<len;k++){
		printf("%d ",w2[k]);
	}
	return 0;
} 

7-4 堆放石子 (100分)

有N堆石子,每堆石子有若干石头,所有石头的总数是N的倍数。

可以在任意一堆上取若干石头,进行移动。移动规则是:在第一堆上取的石子,只能移到第二堆;在第N堆上取的石子,只能移到N-1堆;其他堆上取的,可以移到相邻左边或者右边。如何用最少的移动次数使得每堆石子的数量一样多呢?

当N=4时,4堆石子数为:9、8、17、6

移动3次可以使4堆数目一样多:

从第3堆取4个石子放到第4堆(9、8、13、10)

从第3堆取3个放到第2堆(9、11、10、10)

从第2堆取1个放到第1堆(10、10、10、10)

输入格式:
第一行包含一个整数N(1<= N <=100),表示有N堆石子;

接着有N行,每行一个整数ai(1<= ai <=10000),表示第i堆石子的数量。

输出格式:
输出一个整数,表示使所有石子堆的石子均达到相等时需要的最少移动次数。

输入样例:

4
9 8 17 6

输出样例:

3

#include<stdio.h>
#include<string.h>
int sum,count;
int main(){
	int n;
	scanf("%d",&n);
	int a[107];
	int i,j,k;
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	int aver=sum/n;
	for(i=1;i<n;i++){
		j=aver-a[i];
		if (j!=0){
			a[i]=a[i]+j;
			a[i+1]=a[i+1]-j;
			count++;
		}
	}
	printf("%d",count);
	return 0;
}

7-7 168 (100分)

汉堡包在大街上大摇大摆的走着,看着手机上一道难倒数万人的小学数学题:

1 + 1 = 0

1 + 6 = 1

6 + 6 = 2

8 + 1 = 2

8 + 6 = 3

汉堡包看完之后发现上面这些加法的答案就是看1,6,8中圈圈的个数嘛!

突然之间,所有大厦上的LED屏幕上的广告全部变成数字1,6,8三个数字的随机闪现。

现给你一块n*m的LED屏幕,上面有且仅有一个数字(1,6,or 8),请你输出你看见的那个字母。

输入格式:
第一行输入两个整数n,m(2<= m, n <= 1000);

接下来n行,每行由m个数字0和1组成,其中1表示数字1,6,8的组成部分。

输出格式:
输出一个整数,代表图形表示的数字。

输入样例:

7 7
0 0 0 0 0 0 0
0 0 1 1 1 0 0
0 0 1 0 1 0 0
0 0 1 1 1 0 0
0 0 1 0 1 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0

输出样例:

8

#include<stdio.h>
#include<string.h>
int a[1001][1001],num[1001];
int main(){
	int m,n;
	scanf("%d %d",&n,&m);
	int i,j,k;
	for (i=0;i<n;i++){
		for(j=0;j<m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for (i=0;i<n;i++){
		for(j=0;j<m;j++){
			if (a[i][j]==1){
				num[i]++;
			}
		}
	}
	int t=n-1,max=0,flag=0;
	for (t=n-1;t>=0;t--){
		if (num[t]>0){
			max=num[t];
			break;
		}
	}
	for(k=t;k>=0;k--){
		if (num[k]==0){
			break;
		}
		if (num[k]<max){
			flag++;
			max=num[k];
		}
	}
	switch(flag){
		case 0:printf("1");break;
		case 1:printf("8");break;
		case 2:printf("6");break;
	}
	return 0;
} 

猜你喜欢

转载自www.cnblogs.com/xiao-qingjiang/p/12634344.html