给出一串包含 ( 、 ) 、[ 和 ] 的字符串,字符串在以下三种情况下为合法的:
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;
}
已知公交车中有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;
}
有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;
}
汉堡包在大街上大摇大摆的走着,看着手机上一道难倒数万人的小学数学题:
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;
}
原文:https://www.cnblogs.com/xiao-qingjiang/p/12634344.html