day13 algo 48、51、52、53、54、55、58、60、61、62、63

ALGO-48. 关联矩阵

问题描述
  有⼀一个n个结点m条边的有向图,请输出他的关联矩阵。
输⼊入格式
  第⼀一⾏行行两个整数n、m,表示图中结点和边的数⽬目。n<=100,m<=1000。
  接下来m⾏行行,每⾏行行两个整数a、b,表示图中有(a,b)边。
  注意图中可能含有重边,但不不会有⾃自环。
输出格式
  输出该图的关联矩阵,注意请勿改变边和结点的顺序。
样例例输⼊入
5 9
1 2
3 1
1 5
2 5
2 3
2 3
3 2
4 3
5 4
样例例输出
1 -1 1 0 0 0 0 0 0
-1 0 0 1 1 1 -1 0 0
0 1 0 0 -1 -1 1 -1 0
0 0 0 0 0 0 0 1 -1
0 0 -1 -1 0 0 0 0 1

#include <iostream>
#include <vector>
using namespace std;
int main() {
	int n, m;
	cin >> n >> m;
	vector<vector<int> > t(n, vector<int>(m));
	for (int i = 0; i < m; i++) {
	int a, b;
	cin >> a >> b;
	t[a - 1][i] = 1;
	t[b - 1][i] = -1;
}
	for (int i = 0; i < n; i++) {
	for (int j = 0; j < m; j++) {
	cout << t[i][j] << " ";
}
	cout << endl;
}
	return 0;
}

ALGO-51. Torry的困惑*

问题描述
  Torry从⼩小喜爱数学。⼀一天,⽼老老师告诉他,像2、3、5、7……这样的数叫做质数。
Torry突然想到⼀一个问题,前10、100、1000、10000……个质数的乘积是多少呢?
于是Torry求助于会编程的你,请你算出前n个质数的乘积。不不过,考虑到你才接触编程不不久,
Torry只要你算出这个数模上50000的值。
输⼊入格式
仅包含⼀一个正整数n,其中n<=100000。
输出格式
  输出⼀一⾏行行,即前n个质数的乘积模50000的值。
样例例输⼊入
1
样例例输出
2
思考:
整个过程就是要求前n个的质数
质数就是其因子只有1和它本身,所以一旦有因子可以被整除了就可以跳出,查看是否是它本身。如果是他就是质数

#include<iostream>
using namespace std;

int main(){
	int n,count=0,result=2,temp=3;
	cin>>n;
	while( count<(n-1)&&n!=1){
		int i;
		for(i=2;i<=temp;i++){
			if(temp%i==0)
				break;
		}
		if(i==temp){
			result*=temp;
			result=result%50000;
			count++;
		}
		temp++;
	}
	if(n==0)
		cout<<0;
	else
		cout<<result;
	return 0;
}

ALGO-52. 排列列问题 !

问题描述
求⼀一个0~N-1的排列列(即每个数只能出现⼀一次),给出限制条件(⼀一张N*N的表,第i⾏行行第j列列的1或
0,表示为j-1这个数不不能出现在i-1这个数后⾯面,并保证第i⾏行行第i列列为0),将这个排列列看成⼀一个⾃自然
数,求从⼩小到⼤大排序第K个排列列。
数据规模和约定
N<=10,K<=500000
输⼊入格式
第⼀一⾏行行为N和K,接下来的N⾏行行,每⾏行行N个数,0表示不不能,1表示能
输出格式
所求的排列列
样例例输⼊入
3 2
0 1 1
1 0 0
0 1 0
样例例输出
1 0 2
解释:
对于N=3的没有任何限制的情况
第⼀一:0 1 2
第⼆二:0 2 1
第三:1 0 2
第四:1 2 0
第五:2 0 1
第六:2 1 0
根据题⽬目所给的限制条件由于2不不能出现在1后⾯面,0不不能出现在2后⾯面
第⼀一:0 2 1
第⼆二:1 0 2
第三:2 1 0
思考:他机智的通过index数组进行标注数组a下标

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;
vector<pair<int,int> >v;
int n,k,t,cnt=1;
int a[10],index[10];
int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++)
		a[i]=i;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++){
			cin>>t;
			if(t==0&&i!=j)
				v.push_back({i,j});
		}
	do{
		int flag=0;
		for (int i = 0; i < n; i++)
			index[a[i]] = i;
		for(int i=0;i<v.size();i++){
			if (index[v[i].second] - index[v[i].first] == 1) {
					flag = 1;
					break;
		}
		}
		
		if(flag==0){
			if(cnt==k){
				for(int i=0;i<n;i++)
					cout<<a[i]<<" ";
				break;
			}else{
				cnt++;
			}
		}
	
	}while(next_permutation(a,a+n));
	return 0;
	
}

ALGO-53. 最⼩小乘积-基本型

问题描述

给两组数,各n个。
  请调整每组数的排列列顺序,使得两组数据相同下标元素对应相乘,然后相加的和最⼩小。要求程序
输出这个最⼩小值。
  例例如两组数分别为:1 3  -5和-2 4 1
  那么对应乘积取和的最⼩小值应为:
  (-5) * 4 + 3 * (-2) + 1 * 1 = -25
输⼊入格式
  第⼀一个⾏行行⼀一个数T表示数据组数。后⾯面每组数据,先读⼊入⼀一个n,接下来两⾏行行每⾏行行n个数,每个数
的绝对值⼩小于等于1000。
  n<=8,T<=1000
输出格式
  ⼀一个数表示答案。
样例例输⼊入
2
3
1 3 -5
-2 4 1
5
1 2 3 4 5
1 0 1 0 1
样例例输出
-25
6
思考:
注意下标!!!

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int n;
int main(){
	cin>>n;
	int *sum1=new int [n];
	for(int i=0;i<n;i++){
		int t,sum=0;
		cin>>t;
		int *a=new int [t];
		int *b=new int [t];
		for(int j=0;j<t;j++){
			cin>>a[j];
		}
		for(int j=0;j<t;j++)
			cin>>b[j];
		sort(a,a+t);
		sort(b,b+t);
		for(int j=0;j<t;j++){
			sum+=a[j]*b[t-j-1];
		}
		sum1[i]=sum;
		
	}
	for(int i=0;i<n;i++)
		cout<<sum1[i]<<endl;
	delete []sum1;
	return 0;
}

ALGO-54. 简单加法

(基本型)
问题描述
⾸首先给出简单加法算式的定义:
如果有⼀一个算式(i)+(i+1)+(i+2),(i>=0),在计算的过程中,没有任何⼀一个数位出现了了进位,则称其为简
单的加法算式。
例例如:i=3时,3+4+5=12,有⼀一个进位,因此3+4+5不不是⼀一个简单的加法算式;⼜又如i=112时,
112+113+114=339,没有在任意数位上产⽣生进位,故112+113+114是⼀一个简单的加法算式。
问题:给定⼀一个正整数n,问当i⼤大于等于0且⼩小于n时,有多少个算式(i)+(i+1)+(i+2)是简单加法算式。其
中n<10000。
输⼊入格式
⼀一个整数,表示n
输出格式
⼀一个整数,表示简单加法算式的个数
样例例输⼊入
4
输出
3
分析:判断位数取以10为底的对数更快更⽅便~

#include<iostream>
#include<cmath>
using namespace std;

int main(){
	int n;
	cin>>n;
	int cnt=0;
	for(int i=0;i<n;i++){
		if((int)log10(3*i+3)==(int)log(i))
			cnt++;
	}
	cout<<cnt;
	return 0;
}

ALGO-55. 矩阵加法

问题描述
给定两个N×M的矩阵,计算其和。其中:
N和M⼤大于等于1且⼩小于等于100,矩阵元素的绝对值不不超过1000。
输⼊入格式
输⼊入数据的第⼀一⾏行行包含两个整数N、M,表示需要相加的两个矩阵的⾏行行数和列列数。接下来2N⾏行行每⾏行行包
含M个数,其中前N⾏行行表示第⼀一个矩阵,后N⾏行行表示第⼆二个矩阵。
输出格式
你的程序需要输出⼀一个N
M的矩阵,表示两个矩阵相加的结果。注意,输出中每⾏行行的最后不不应有多余
的空格,否则你的程序有可能被系统认为是Presentation  Error
样例例输⼊入
2 2
1 2
3 4
5 6
7 8
样例例输出
6 8
10 12
分析:两个矩阵相加就正常相加

#include<iostream>
using namespace std;
int n,m;
int main(){
	cin>>n>>m;
	int a[101][101];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>a[i][j];
	int t;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
			cin>>t;
			a[i][j]+=t;
			}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
		}
	return 0;		
}

ALGO-58. 字串串逆序

问题描述
  给定⼀一个字符串串,将这个串串的所有字⺟母逆序后输出。
输⼊入格式
  输⼊入包含⼀一个字符串串,⻓长度不不超过100,字符串串中不不含空格。
输出格式
  输出包含⼀一个字符串串,为上⾯面字符串串的逆序。
样例例输⼊入
tsinsen
样例例输出
nesnist

这道题竟然会出现在这里,神奇

#include<iostream>
#include<cstring>
using namespace std;

string s1,s2;
int main(){
	cin>>s1;
	for(int i=s1.length()-1;i>=0;i--)
		cout<<s1[i];
	return 0;
	
}

ALGO-60. 矩阵乘⽅方!!

问题描述
给定⼀一个矩阵A,⼀一个⾮非负整数b和⼀一个正整数m,求A的b次⽅方除m的余数。
其中⼀一个nxn的矩阵除m的余数得到的仍是⼀一个nxn的矩阵,这个矩阵的每⼀一个元素是原矩阵对应位置
上的数除m的余数。
要计算这个问题,可以将A连乘b次,每次都对m求余,但这种⽅方法特别慢,当b较⼤大时⽆无法使⽤用。下
⾯面给出⼀一种较快的算法(⽤用A^b表示A的b次⽅方):
若b=0,则A^b%m=I%m。其中I表示单位矩阵。
若b为偶数,则Ab%m=(A(b/2)%m)^2%m,即先把A乘b/2次⽅方对m求余,然后再平⽅方后对m求余。
若b为奇数,则Ab%m=(A(b-1)%m)*a%m,即先求A乘b-1次⽅方对m求余,然后再乘A后对m求余。
这种⽅方法速度较快,请使⽤用这种⽅方法计算A^b%m,其中A是⼀一个2×2的矩阵,m不不⼤大于10000。
输⼊入格式
输⼊入第⼀一⾏行行包含两个整数b, m,第⼆二⾏行行和第三⾏行行每⾏行行两个整数,为矩阵A。
输出格式
输出两⾏行行,每⾏行行两个整数,表示A^b%m的值。
样例例输⼊入
2 2
1 1
0 1
样例例输出
1 0
0 1

#include <iostream>
#include <vector>
using namespace std;
vector<int> f(vector<int> v, int k, int m) {
vector<int> ans(5);
if (k == 0) {
ans[1] = ans[4] = 1;
ans[2] = ans[3] = 0;
} else {
if (k % 2 == 0) {
vector<int> t = f(v, k / 2, m);
ans[1] = (t[1] * t[1] + t[2] * t[3]) % m;
ans[2] = (t[1] * t[2] + t[2] * t[4]) % m;
ans[3] = (t[3] * t[1] + t[4] * t[3]) % m;
ans[4] = (t[3] * t[2] + t[4] * t[4]) % m;
} else {
vector<int> t = f(v, k - 1, m);
ans[1] = (t[1] * v[1] + t[2] * v[3]) % m;
ans[2] = (t[1] * v[2] + t[2] * v[4]) % m;
ans[3] = (t[3] * v[1] + t[4] * v[3]) % m;
ans[4] = (t[3] * v[2] + t[4] * v[4]) % m;
}
}
return ans;
}
int main() {
int k, m, a, b, c, d;
vector<int> v(5), ans;
cin >> k >> m >> v[1] >> v[2] >> v[3] >> v[4];
ans = f(v, k, m);
printf("%d %d\n%d %d\n", ans[1], ans[2], ans[3], ans[4]);
return 0;
}

ALGO-61. 奇偶判断

问题描述
  能被2整除的数称为偶数,不不能被2整除的数称为奇数。给⼀一个整数x,判断x是奇数还是偶数。
输⼊入格式
  输⼊入包括⼀一个整数x,0<=x<=100000000。
输出格式
  如果x是奇数,则输出“odd”,如果是偶数,则输出“even”。
样例例输⼊入
10
样例例输出
even
样例例输⼊入
2009

#include<iostream>
using namespace std;
int main(){
	int x;
	cin>>x;
	if(x%2==0)
		cout<<"even";
	else {
		cout<<"odd";
	} 
	return 0;
}

ALGO-62. 平⽅方计算

问题描述
  输⼊入正整数a, m,输出a2%m,其中表示乘⽅方,即a^2表示a的平⽅方,%表示取余。
输⼊入格式
  输⼊入包含两个整数a, m,a不不超过10000。
输出格式
  输出⼀一个整数,即a^2%m的值。
样例例输⼊入
5 6
样例例输出
1

#include<iostream>
using namespace std;
int main(){
	int a,m;
	cin>>a>>m;
	cout<<a*a%m;
	return 0;
}

ALGO-63. 乘法表

问题描述
  输出九九乘法表。
  输出格式
  输出格式⻅见下⾯面的样例例。乘号⽤用“”表示。
样例例输出
下⾯面给出输出的前⼏几⾏行行:
1
1=1
21=2 22=4
31=3 32=6 33=9
4
1=4 42=8 43=12 4*4=16

#include<iostream>
using namespace std;
int main(){
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			cout<<i<<"*"<<j<<"="<<i*j<<" ";
			if(i==j)
				break;
		}
		cout<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值