day17 algo 86、87、95、105、112、120、122

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值