• 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;
    } 
    
  • 相关阅读:
    Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用
    玩转Web之html+CSS(一)---论坛首页表格的实现
    Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
    Android 百度地图 SDK v3.0.0 (一)
    RabbitMQ (五)主题(Topic)
    RabbitMQ (四) 路由选择 (Routing)
    数据结构中的排序算法
    冒泡排序
    hashMap与hashTable的区别
    Java重载与重写的区别
  • 原文地址:https://www.cnblogs.com/xiao-qingjiang/p/12634344.html
Copyright © 2020-2023  润新知