郑轻oj
1124: 两个有序数组合并
题目描述
已知数组a中有m个按升序序排列的元素,数组b中有n个降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。
输入
输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m, n均小于等于1000000。
输出
输出合并后的m+n个整数,数据之间用空格隔开,输出占一行。
样例输入
样例输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <stdio.h> #include <stdlib.h> int a[1000010],b[1000010]; int main() { int i,j; int m,n; scanf("%d",&m); for(i=m-1; i>=0; i--) scanf("%d",&a[i]); scanf("%d",&n); for(j=0; j<n; j++) scanf("%d",&b[j]); i=0; j=0; int k=0; int c[m+n]; while(i<m&&j<n) { if(a[i]>=b[j]) c[k++]=a[i++]; else c[k++]=b[j++]; } while (i < m) c[k++] = a[i++]; while (j < n) c[k++] = b[j++]; for(k=0; k<m+n-1; k++) printf("%d ",c[k]); printf("%d",c[m+n-1]); return 0; }
|
1127: 矩阵乘积
题目描述
计算两个矩阵A和B的乘积。
输入
第一行三个正整数m、p和n,0<=m,n,p<=10,表示矩阵A是m行p列,矩阵B是p行n列;
接下来的m行是矩阵A的内容,每行p个整数,用空格隔开;
最后的p行是矩阵B的内容,每行n个整数,用空格隔开。
输出
输出乘积矩阵:输出占m行,每行n个数据,以空格隔开。
样例输入
1 2 3 4 5 6 7 8
| 2 3 4
1 0 1 0 0 1
1 1 1 3 4 5 6 7 8 9 1 0
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <stdio.h> #include <stdlib.h> int main() { int a[11][11],b[11][11],c[11][11]; int m,p,n; int i,j,k; scanf("%d%d%d",&m,&p,&n); for(i=0; i<m; i++) for(j=0; j<p; j++) scanf("%d",&a[i][j]); for(i=0; i<p; i++) for(j=0; j<n; j++) scanf("%d",&b[i][j]); for(i=0; i<m; i++) for(j=0; j<n; j++) { c[i][j]=0; for(k=0; k<p; k++) { c[i][j]+=a[i][k]*b[k][j]; } } for(i=0; i<m; i++) { for(j=0; j<n; j++) { if(j==0) printf("%d",c[i][j]); else printf(" %d",c[i][j]); } printf("\n"); } return 0; }
|
1143-1144: 多种进制
将10进制正整数n转换成k进制数字符串输出
1 2 3 4 5 6 7 8 9 10 11 12
| void dToK(int n,int k,char str[]) { int i,x=0; for(i=0;n!=0;i++) { str[i]=n%k; n=n/k; x++; } for(i=x-1;i>=0;i--) printf("%d",str[i]); }
|
将k进制数字符串转换成10进制正整数n输出
1 2 3 4 5 6 7 8 9 10 11 12
| int KToD(char str[], int k) { int i; int sum = 0; for(i=0; i<strlen(str); i++) { sum=sum*k+(str[i]-'0'); } return sum; }
|
1151: 大整数加法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include<stdio.h> #include<string.h> char m[1022],n[1022]; int c[1022]; int lres; int lm,ln; void update() { if(c[lres] >=10) c[++lres]++,c[lres-1] %=10; else lres++; } int main() { int t; scanf("%d",&t); getchar(); while(t--) { memset(c,0,sizeof(c)); scanf("%s%s",m,n); lm = strlen(m)-1; ln = strlen(n)-1; lres = 0; while(lm>=0&&ln>=0) c[lres] += m[lm--]-'0' + n[ln--] - '0',update(); while(lm>=0) c[lres]+=m[lm--]-'0',update(); while(ln>=0) c[lres] += n[ln--]-'0',update(); int f = 0; for(int i=lres; i>=0; i--) { if(c[i]!=0) f=1; if(f == 1) printf("%d",c[i]); } printf("\n"); } return 0; }
|
1152: 二分搜索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int BSearch(int a[],int x,int low,int high) { int mid; if(low>high) return -1; else { mid=(low+high)/2; if(x==a[mid]) return mid; else if(x<a[mid]) return BSearch(a,x,low,mid-1); else return BSearch(a,x,mid+1,high); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include<bits/stdc++.h> using namespace std; int main() { int m,n,idx=0,i,j; cin>>m>>n; for(i=0;i<m;i++) { cout<<">"; for(j=0;j<n;j++,idx++) { cout<<(char)('a'+idx%26); } cout<<"<"<<endl; } return 0; }
|
最终状态有两种:
要么 wbwbwbw….
要么 bwbwbwb….
所以我们枚举两种情况,对于任何一种情况,分别用 x 和 y 表示没有 放对位置的黑书和白书的数量。对于每种情况,我们都先找出最小 的 交换次数,即 min(x,y),剩下的我们直接从小豪那里拿书替代。 故每种情况最少的操作次数为 :
min(x,y)+[max(x,y)-min(x,y)]=max(x,y);
则最终结果:
ans=min(max(x1,y1),max(x2,y2));
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <stdio.h> #include <string.h> #include <ctype.h> typedef long long ll; char S[100010]; int max(int x, int y) { if (x > y) return x; return y; } int min(int x, int y) { if (x > y) return y; return x; } int main() { int n, len; scanf("%d", &n); scanf("%s", S); int flag1, flag2; int sum1, sum2; flag1 = flag2 = sum1 = sum2 = 0; len = strlen(S); for (int i = 0; i < len; i++) { if (S[i] == 'w') { if (i & 1)flag1++; else flag2++; } else { if (i & 1) sum1++; else sum2++; } } int ans = min(max(flag1, sum2), max(sum1, flag2)); printf("%d", ans); return 0; }
|
有一个不错的位运算公式
(a&b)+(a|b)=a+b;
然后就是根据序列和来推出原序列了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <bits/stdc++.h> using namespace std; char s[1010]; int main() { long long n; int t; scanf("%lld%d", &n, &t); while (t--) { int x, y; scanf("%d%d", &x, &y); int a = n & (1 << (x - 1)); if (a) { n -= (1 << (x - 1)); x += y; int b = n & (1 << (x - 1)); n += (1 << (x - 1)); } printf("%lld\n", n); } return 0; }
|
牛客
待更新