东方博宜oj2160,1229,1375题解

先说一下,这几天不会再更新,我会尽量抽时间更新后面的题解,抱歉。

2160

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N][N];	
typedef long long LL;
LL f[N][N];
int n, m; 

int main(){
	scanf("%d%d", &n, &m);
	for(int i=1; i<=n; i++){
		for(int j=1; j<=m; j++){
			scanf("%d", &a[i][j]);
		}
	}
	memset(f, -0x7f, sizeof(f));
	
	LL ma;	
	f[1][0] = 0;
	for(int j=1; j<=m; j++){
		
		ma = -1e18;
		for(int i=1; i<=n; i++){
			ma = max(ma, f[i][j-1]) + a[i][j];
			f[i][j] = max(f[i][j], ma);	
		}
		
		
		ma = -1e18;
		for(int i=n; i>=1; i--){
			ma = max(ma, f[i][j-1]) + a[i][j];
			f[i][j] = max(f[i][j], ma); 
		}
	}
	
	cout << f[n][m];

	return 0;
}

1229

#include<bits/stdc++.h>
using namespace std;
int a[1100],n,i,j,x,p,k = 0;
int main()
{
	cin>>n;
	for (i = 1;i <= n; i++)
{
		cin>>x;
		p = -1;
		for (j = 1;j <= k; j++)
{
			if (a[j] >= x)
{
				p = j;
				break;
			}
		}
		if (p != -1)
{
			a[p] = x;
		}else{
			k++;
			a[k] = x;
		}
	}
cout<<k;
	return 0;
}
//syy24222

1375

#include<bits/stdc++.h> 
using namespace std;
int main(){
	int n,a[1010]={},c=0,sum,temp;
	bool isFind=false;
	vector< vector<int> > v;

	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];		
	} 
		while(!isFind){
		temp=INT_MAX;
		if(c == v.size()) v.push_back(vector<int>());
		sum=0;
		for(int i=0;i<n;i++){
			if(a[i]==0) continue;
			sum+=a[i];
			if(temp>a[i]){
				temp=a[i];
				v[c].push_back(a[i]);
				a[i]=0;
			}
		}

		if(0==sum){
			isFind=true;
		}else{
			++c;
		}
	}

	cout<<c<<endl; 
	for(int i=0;i<c;i++){
		cout<<i+1<<":";
		for(int j=0;j<v[i].size();j++){
			cout<<v[i][j];
			if(j!=v[i].size()-1) cout<<" ";
		}
		cout<<endl;
	}
	return 0;	
}

1336

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

int gcd(int a, int b) {
    while (b!= 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

void simplify(int& numerator, int& denominator) {
    int divisor = gcd(abs(numerator), denominator);
    numerator /= divisor;
    denominator /= divisor;
    if (denominator < 0) {
        numerator = -numerator;
        denominator = -denominator;
    }
}

int main() {
    string expression;
    cin >> expression;
    int slash1 = expression.find('/');
    int slash2 = expression.find('/', slash1 + 1);
    int plusMinus = expression.find('+', slash1 + 1);
    if (plusMinus == string::npos) {
        plusMinus = expression.find('-', slash1 + 1);
    }
    int numerator1 = stoi(expression.substr(0, slash1));
    int denominator1 = stoi(expression.substr(slash1 + 1, plusMinus - slash1 - 1));
    int numerator2 = stoi(expression.substr(plusMinus + 1, slash2 - plusMinus - 1));
    int denominator2 = stoi(expression.substr(slash2 + 1));
    int commonDenominator = denominator1 * denominator2;
    int newNumerator;
    if (expression[plusMinus] == '+') {
        newNumerator = numerator1 * denominator2 + numerator2 * denominator1;
    } else {
        newNumerator = numerator1 * denominator2 - numerator2 * denominator1;
    }
    simplify(newNumerator, commonDenominator);
    if (newNumerator == 0) {
        cout << 0;
    } else if (commonDenominator == 1) {
        cout << newNumerator;
    } else {
        cout << newNumerator << "/" << commonDenominator;
    }
    return 0;
}
//一堆乱码,笑死我了

1339

#include <iostream>
    #include <string>
    using namespace std;
    
    // 两个数的最大公约数
    int gcd(int a,int b){
        if(a%b==0){
            return b;
        }
        return gcd(b,a%b);
    }
    
    // 求两个分数的和,结果为分数
    string he(string s1,string s2){
        // 1/12
        //   0123
        string r;
        int x1,y1,x2,y2,x,y;
        int p1 = (int)s1.find('/');
        int p2 = (int)s2.find('/');
        
        x1 = stoi(s1.substr(0,p1));
        y1 = stoi(s1.substr(p1+1,s1.size()-1-p1));
        
        
        x2 = stoi(s2.substr(0,p2));
        y2 = stoi(s2.substr(p2+1,s2.size()-1-p2));
        
        
        y = y1*y2;
        x = x1*y2 + x2*y1;
        
        // 求最大公约数
        int m = gcd(x,y);
        x = x/m;
        y = y/m;
        
        return to_string(x)+"/"+to_string(y);
    }
    
    string s,r,sum="0/1";
    int i;
    int main() {
    //    cout<<he("1/12", "5/12");
        cin>>s;
        for(i=0;i<s.size();i++){
            if(s[i]!='+'){
                r += s[i];
                
                if(i==s.size()-1 || s[i+1]=='+'){
    //                cout<<r<<endl;
                    sum = he(sum, r);
                    r.clear();
                }
            }
        }
    //    cout<<sum<<endl;
        int sum_x,sum_y;
        int p = (int)sum.find('/');
        
        sum_x = stoi(sum.substr(0,p));
        sum_y = stoi(sum.substr(p+1,sum.size()-1-p));
        
        if(sum_x==sum_y){
            cout<<1<<endl;
        }else if(sum_x%sum_y==0){
            cout<<sum_x/sum_y<<endl;
        }else{
            cout<<sum<<endl;
        }
        
        return 0;
    }

1358

#include<bits/stdc++.h>
using namespace std;

int a[20];
bool f[20];
int n,cnt=0;

bool isprime(int n){
	if(n<=1) return false;
	for(int i=2; i<=sqrt(n); i++) 
		if(n%i==0) return false;
	
	return true;
}

void print(){
	cnt++;
	cout << cnt << ':';
	for(int i=1; i<=n; i++){
		cout << a[i] << ' ';
	}
	cout << endl;
}

void dfs(int k){
	int i;
	
	for(i=1; i<=n; i++){
		if(!f[i] && (k==1 || isprime(i+a[k-1]))){
			a[k] = i;
			if(k==n && isprime(a[k]+a[1])){
				print();
			}else{
				f[i] = true;
				dfs(k+1);
				f[i] = false;
			}	
		}
	}
}

int main(){
	cin >> n;
	
	dfs(1);

	cout << "total:" << cnt;
	return 0;
}

1362

#include<iostream>
using namespace std;
bool a[5][9]; //标记坐标是否走过
int b[50][2]; //保存步骤坐标
int c= 0;
int fx[4] = {2, 1, -1, -2};
int fy[4] = {1, 2, 2, 1};
void print(int k)
{
    c++;
    printf("%d:", c);
    for(int i = 1; i < k; i++)
    {
        printf("%d,%d->", b[i][0], b[i][1]);
    }
    printf("%d,%d\n", b[k][0], b[k][1]);
}

void dfs(int x, int y, int k)
{
    b[k][0] = x;
    b[k][1] = y;
    for(int i = 0; i < 4; i++)
    {
        int dx = x + fx[i];
        int dy = y + fy[i];
        if(dx >= 0 && dx <= 4 && dy >= 0 && dy <= 8 && a[dx][dy] == false)
        {
            b[k+1][0] = dx;
            b[k+1][1] = dy;
            a[dx][dy] = true;
            if(dx == 4 && dy == 8)
            {
                print(k+1);
            }else
            {
                dfs(dx, dy, k+1);
            }
            a[dx][dy] = false;

        }
    }
}


int main()
{
    a[0][0] = true;
    dfs(0, 0, 1);
    return 0;
}

1364

#include <bits/stdc++.h>
using namespace std;

int main(){
	int n,m;
	int s1=0,s2=0,s3=0,s=0;
	
	cin >> n >> m;
	
	for(int i=0; i<min(n,m); i++){
		s1 += (m - i) * (n - i);
	}
	for(int i=1; i<=n; i++){
		s2 += i;
	}
	for(int i=1; i<=m; i++){
		s3 += i;
	}
	s2 = s2 * s3 - s1;
	
	cout << s1 << ' ' << s2 << endl;

	return 0;
}

1368

#include<bits/stdc++.h>
using namespace std;
//当n-m的值较大时需要高精度运算 
string he(string s1,string s2){
 	string r;//存放总和
	int a[1000] = {0};
	int b[1000] = {0};
	int c[1000] = {0};
	
	//逆序存入整数数组
	int i;
	for(i = 0;i < s1.size();i++){
		a[i] = s1[s1.size() - i - 1] - '0';
	} 
	
	for(i = 0;i < s2.size();i++){
		b[i] = s2[s2.size() - i - 1] - '0';
	} 
	
	//逐位相加,逐位进位
	int len = s1.size();
	if(s2.size() > s1.size()) len = s2.size();
	
	for(i = 0;i < len;i++){
		c[i] = c[i] + a[i] + b[i];
		if(c[i] >= 10){
			c[i+1] = c[i+1] + c[i] / 10;
			c[i] = c[i] % 10;
		}
	} 
	//判断是否多出1位
	if(c[len] != 0) len++;

	//逆序将c数组拼接乘字符串
	for(i = len-1;i>=0;i--){
		//将c[i]+'0'这个ascii码强制转换为char类型 
		r = r + (char)(c[i] + '0');
	} 

	return r; 
} 

int main(){
    int m,n,i,j;
    cin>>m>>n;
    i = n - m;
    string x,y,z;
    x = "1";
    y = "1";
    if(i==1){
    	cout<<x;
	}else if(i==2){
		cout<<y;
	}else{
		for(j=3;j<=i+1;j++){
			z = he(x,y);
			x = y;
			y = z;
		}
		cout<<z;
	}
    return 0;
}

1369

#include <bits/stdc++.h>
using namespace std;
/*
  An = A(n-1)*2 + A(n-2)
*/
//求两个高精度的整数的和
string he(string s1,string s2){
 	string r;//存放总和
	int a[1000] = {0};
	int b[1000] = {0};
	int c[1000] = {0};
	
	//逆序存入整数数组
	int i;
	for(i = 0;i < s1.size();i++){
		a[i] = s1[s1.size() - i - 1] - '0';
	} 
	
	for(i = 0;i < s2.size();i++){
		b[i] = s2[s2.size() - i - 1] - '0';
	} 
	
	//逐位相加,逐位进位
	int len = s1.size();
	if(s2.size() > s1.size()) len = s2.size();
	
	for(i = 0;i < len;i++){
		c[i] = c[i] + a[i] + b[i];
		if(c[i] >= 10){
			c[i+1] = c[i+1] + c[i] / 10;
			c[i] = c[i] % 10;
		}
	} 
	
	//判断是否多出1位
	if(c[len] != 0) len++;
	
	//逆序将c数组拼接乘字符串
	for(i = len-1;i>=0;i--){
		//将c[i]+'0'这个ascii码强制转换为char类型 
		r = r + (char)(c[i] + '0');
	} 
	
	return r; 
} 

//求一个高精度的整数 * 2的积 
string cheng(string s){
	string r;
	int a[1000] = {0};
	int i;
	//逆序存入a数组 
	for(i = 0;i < s.size();i++){
		a[i] = s[s.size() - i - 1] - '0';
	}
	
	//逐位*2
	for(i = 0;i < s.size();i++){
		a[i] = a[i] * 2;
	} 
	
	//逐位进位
	for(i = 0;i < s.size();i++){
		if(a[i] >= 10){
			a[i+1] = a[i+1] + a[i] / 10;
			a[i] = a[i] % 10; 
		}
	} 
	
	//判断是否多一位
	int len = s.size();
	if(a[len] != 0) len++;
	//逆序拼接到字符串r上
	for(i = len - 1;i >= 0;i--){
		r = r + to_string(a[i]);
	} 
	 
	return r;
}

int main(){
	//z:代表计算结果,xy代表z的前两项 
	string x,y,z;
	int i,n;
	cin>>n;
	//A(n)=A(n-1)*2+A(n-2)
	x = "1";
	y = "2";
	if(n == 1){
		cout<<x;
	} else if(n == 2){
		cout<<y;
	} else{
		//从第3项开始递推
		for(i = 3;i <= n;i++){
			z = he(cheng(y),x);
			//修改xy的值,逐步向后推导
			x = y;
			y = z; 
		} 
		
		cout<<z;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值