ALGO-86. 矩阵乘法*!
问题描述
输⼊入两个矩阵,分别是ms,sn⼤大⼩小。输出两个矩阵相乘的结果。
输⼊入格式
第⼀一⾏行行,空格隔开的三个正整数m,s,n(均不不超过200)。
接下来m⾏行行,每⾏行行s个空格隔开的整数,表示矩阵A(i,j)。
接下来s⾏行行,每⾏行行n个空格隔开的整数,表示矩阵B(i,j)。
输出格式
m⾏行行,每⾏行行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值。
样例例输⼊入
2 3 2
1 0 -1
1 1 -3
0 3
1 2
3 1
样例例输出
-3 2
-8 2
我觉得竟然还好
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int m,s,n;
cin>>m>>s>>n;
int a[m][s],b[s][n],c[m][n];
memset(c,0,sizeof(c));
for(int i=0;i<m;i++)
for(int j=0;j<s;j++)
cin>>a[i][j];
for(int i=0;i<s;i++)
for(int j=0;j<n;j++)
cin>>b[i][j];
int i,j,k;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
for(k=0;k<s;k++){
c[i][j]+=a[i][k]*b[k][j];
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
return 0;
}
ALGO-87. 字串串统计*!
问题描述
给定⼀一个⻓长度为n的字符串串S,还有⼀一个数字L,统计⻓长度⼤大于等于L的出现次数最多的⼦子串串(不不同
的出现可以相交),如果有多个,输出最⻓长的,如果仍然有多个,输出第⼀一次出现最早的。
输⼊入格式
第⼀一⾏行行⼀一个数字L。
第⼆二⾏行行是字符串串S。
L⼤大于0,且不不超过S的⻓长度。
输出格式
⼀一⾏行行,题⽬目要求的字符串串。
输⼊入样例例1:
4
bbaabbaaaaa
输出样例例1:
bbaa
输⼊入样例例2:
2
bbaabbaaaaa
输出样例例2:
aa
数据规模和约定
n<=60
S中所有字符都是⼩小写英⽂文字⺟母。
思考:
枚举所有的可能性并记录数目就好
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int l;
string s,s1,s2,ans;
cin>>l>>s;
int count=1,temp=l,max=0;
while(temp<=s.length()){
for(int i=0;i<s.length()-temp;i++){
s1=s.substr(i,temp);
for(int j=i+1;j<s.length()-temp;j++){
s2=s.substr(j,temp);
if(s1==s2)
count++;
}
if(count>max)
{
ans=s1;
max=count;
}
count=1;
}
temp++;
}
cout<<ans;
return 0;
}
ALGO-95. 2的次幂表示!!!
问题描述
任何⼀一个正整数都可以⽤用2进制表示,例例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂⾼高的排在前⾯面,可得到如下表达式:
137=27+23+2^0
现在约定幂次⽤用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进⼀一步:7=22+2+20 (2^1⽤用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
⼜又如:1315=210+28+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输⼊入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不不能有空格)
样例例输⼊入
137
样例例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例例输⼊入
1315
样例例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
这道题要想的有点多,递归输出
#include<iostream>
using namespace std;
int s[100]={0};
void f(int a){
int i=0,b;
if(a==0)
cout<<"";
else{
while(a!=0){
s[i++]=a%2;
a/=2;
}
for(int j=0;j<i-1;j++){
if(s[j]==1){
b=j;
break;
}
}
for(int c=i-1;c>=b+1;c--){
if(s[c]==1){
if(c==1)
cout<<"2+";
if(c==2)
cout<<"2(2)+";
else{
cout<<"2(";
f(c);
cout<<")+";
}
}
}
if(b==0)
cout<<"2(0)";
else if(b==1)
cout<<"2";
else if(b==2)
cout<<"2(2)";
else{
cout<<"2(";
f(b);
cout<<")";
}
}
}
int main(){
int n;
cin>>n;
f(n);
return 0;
}
ALGO-105. ⿊黑⾊色星期五*!
问题描述
有些⻄西⽅方⼈人⽐比较迷信,如果某个⽉月的13号正好是星期五,他们就会觉得不不太吉利利,⽤用古⼈人的说法,就
是“诸事不不宜”。请你编写⼀一个程序,统计出在某个特定的年年份中,出现了了多少次既是13号⼜又是星期五
的情形,以帮助你的迷信朋友解决难题。
说明:(1)⼀一年年有365天,闰年年有366天,所谓闰年年,即能被4整除且不不能被100整除的年年份,或是既
能被100整除也能被400整除的年年份;(2)已知1998年年1⽉月1⽇日是星期四,⽤用户输⼊入的年年份肯定⼤大于或
等于1998年年。
输⼊入格式:输⼊入只有⼀一⾏行行,即某个特定的年年份(⼤大于或等于1998年年)。
输出格式:输出只有⼀一⾏行行,即在这⼀一年年中,出现了了多少次既是13号⼜又是星期五的情形。
输⼊入输出样例例
样例例输⼊入
1998
样例例输出
3
思考:
其实仔细想想还好
不过在计算星期几的时候要注意 在有参考系时(1998年年1⽉月1⽇日是星期四)sum是要-4(星期四)才能算出来现在是星期几
#include<iostream>
#include<cstring>
using namespace std;
int month[2][13]={{0,31,29,31,30,31,30,31,31,30,31,30,31},{0,31,28,31,30,31,30,31,31,30,31,30,31}};
int year[2]={366,365};
int f(int y){
if(y%4==0&&y%100==0||y%100==0&&y%400==0) return 0;
else return 1;
}
int main(){
int y1=1998,flag;
int y,sum=0,count=0,sum1=0;
cin>>y;
for(int j=y1;j<=y;j++){
if(j==y){
flag=f(j);
for(int i=0;i<12;i++){
sum=month[flag][i]+sum;
sum1=sum+13;
if((sum1-4)%7==5)
count++;
}
}
else{
flag=f(j);
sum+=year[flag];
}
}
cout<<count;
return 0;
}
ALGO-112. 暗恋!!
问题描述
同在⼀一个⾼高中,他却不不敢去找她,虽然在别⼈人看来,那是再简单不不过的事。暗恋,是他唯⼀一能做的
事。他只能在每天课间操的时候,望望她的位置,看看她倾⼼心的动作,就够了了。操场上的彩砖啊,你
们的位置,就是他们能够站⽴立的地⽅方,他俩的关系就像砖与砖之间⼀一样固定,⽆无法动摇。还记得当初
铺砖的⼯工⼈人,将整个操场按正⽅方形铺砖(整个操场可视为R⾏行行C列列的矩阵,矩阵的每个元素为⼀一块正⽅方
形砖块),正⽅方形砖块有两种,⼀一种为蓝⾊色,另⼀一种为红⾊色。我们定义他和她之间的“爱情指标”为最
⼤大纯⾊色正⽅方形的⾯面积,请你写⼀一个程序求出“爱情指标”。
输⼊入格式
第⼀一⾏行行两个正整数R和C。
接下来R⾏行行C列列描述整个操场,红⾊色砖块⽤用1来表示,蓝⾊色砖块⽤用0来表示。
输出格式
⼀一个数,表示他和她之间的“爱情指标”。
样例例输⼊入
5 8
0 0 0 1 1 1 0 1
1 1 0 1 1 1 1 1
0 1 1 1 1 1 0 1
1 0 1 1 1 1 1 0
1 1 1 0 1 1 0 1
样例例输出
9
数据规模和约定
40%的数据R,C<=10;
70%的数据R,C<=50;
100%的数据R,C<=200;
分析:枚举所有⽅方块的最左上⻆角的点,依次向右下⻆角探测,得到能探测到的最⼤大⾯面积,取最⼤大值即可
~
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int m[210][210], ans = 0, r, c;
int check(int a, int b){
for(int k = 1;; k++){
for(int i = a; i <= a + k; i++)
if(m[i][b+k] != m[a][b]) return k * k;
for(int i = b; i <= b + k; i++)
if(m[a+k][i] != m[a][b]) return k * k;
}
}
int main() {
fill(m[0],m[0]+210*210,-1);
scanf("%d%d", &r, &c);
for(int i = 1; i <= r ; i++)
for(int j = 1; j <= c; j++)
scanf("%d",&m[i][j]);
for(int i = 1; i <= r ; i++)
for(int j = 1; j <= c; j++)
ans = max(ans,check(i,j));
cout << ans << endl;
return 0;
}
ALGO-120. 学做菜*
问题描述
涛涛⽴立志要做新好⻘青年年,他最近在学做菜。由于技术还很⽣生疏,他只会⽤用鸡蛋,⻄西红柿,鸡丁,辣酱
这四种原料料来做菜,我们给这四种原料料标上字⺟母A,B,C,D。
涛涛现在会做的菜有五种:
1、 ⻄西红柿炒鸡蛋 原料料:AABDD
2、 酸辣鸡丁 原料料:ABCD
3、 宫保鸡丁 原料料:CCD
4、 ⽔水煮⻄西红柿 原料料:BBB
5、 怪味蛋 原料料:AD
这天早上,开开去早市给涛涛买了了⼀一些原料料回来。由于事先没有什什么计划,涛涛决定,对于现存的原
料料,每次尽量量做菜单上靠前(即编号⼩小)的菜。
现在请你写⼀一个程序,判断⼀一下开开和涛涛中午能吃到哪些菜。
输⼊入格式
共4个整数a,b,c,d。分别表示开开买的A,B,C,D这4种原料料的数量量。每种原料料不不会超过30份。
输出格式
输出5⾏行行。其中第i⾏行行表示涛涛做的第i种菜的数⽬目。
样例例输⼊入
3
1
2
4
样例例输出
1
0
1
0
1
思考:
方法可以,优点去敲完了,找可以承受的最小值
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
if (a >= 2 && b >= 1 && d >= 2) {
int minn1 = min(a / 2, b / 1);
int minn = min(minn1, d / 2);
a -= minn * 2;
b -= minn * 1;
d -= minn * 2;
cout << minn << endl;
}else{
cout << 0 << endl;
}
if (a >= 1 && b >= 1 && d >= 1) {
int minn1 = min(a / 1, b / 1);
int minn2 = min(c / 1, d / 1);
int minn = min(minn1, minn2);
a -= minn * 1;
b -= minn * 1;
c -= minn * 1;
d -= minn * 1;
cout << minn << endl;
}else{
cout << 0 << endl;
}
if (c >= 2 && d >= 1) {
int minn = min(c / 2, d / 1);
c -= minn * 2;
d -= minn * 1;
cout << minn << endl;
}else{
cout << 0 << endl;
}
if (b >= 3) {
int minn = b / 3;
c -= minn * 3;
cout << minn << endl;
}else{
cout << 0 << endl;
}
if(a >= 1 && d >= 1){
int minn = min(a / 1, d / 1);
cout << minn << endl;
}else{
cout << 0 << endl;
}
return 0;
}
ALGO-122. 未名湖边的烦恼 !
问题描述
每年年冬天,北北⼤大未名湖上都是滑冰的好地⽅方。北北⼤大体育组准备了了许多冰鞋,可是⼈人太多了了,每天
下午收⼯工后,常常⼀一双冰鞋都不不剩。
每天早上,租鞋窗⼝口都会排起⻓长⻰龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些
⼈人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场⾯面。(两个同样需求的⼈人(⽐比如都是租
鞋或都是还鞋)交换位置是同⼀一种排法)
输⼊入格式
两个整数,表示m和n
输出格式
⼀一个整数,表示队伍的排法的⽅方案数。
样例例输⼊入
3 2
样例例输出
5
数据规模和约定
m,n∈[0,18]
#include <iostream>
using namespace std;
int f(int m, int n) {
if (m < n)
return 0;
if(n == 0)
return 1;
return f(m - 1, n) + f(m, n - 1);
}
int main() {
int m, n;
cin >> m >> n;
cout << f(m, n);
return 0;
}