完美的代价、矩形面积交、矩阵乘法、分解质因数

目录

完美的代价:

思路:

代码:

矩形面积交:

思路:

代码:

矩阵乘法:

思路;

代码:

分解质因数:

原题链接:

思路:

时间转换:

 代码:


完美的代价:

原题链接:“蓝桥杯”练习系统 (lanqiao.cn)

思路:

采用局部最优解思路(又称贪心思想),从尾部寻找能与头部元素能匹配的第一个,然后直接移动到最后,使得这两个字母对称,以此类推

代码:

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

int n;
string s;
int ans,flag;

int main(){
    cin>>n>>s;
    for(int i=0;i<n;i++){
        for(int j=n-1;j>=i;j--){
            if(j==i){
                if(s.size()%2==0||flag==1){
                    cout<<"Impossible"<<endl;
                    system("pause");
                    return 0;
                }
                flag++;
                ans+=s.size()/2-i;
            }
            else if(s[i]==s[j]){
                for(int k=j;k<n-1;k++)
                    swap(s[k],s[k+1]);
                ans+=n-j-1;
                n--;
                break;
            }
        }
    }
    cout<<ans;
    system("pause");
    return 0;
}

矩形面积交:

原题链接:“蓝桥杯”练习系统 (lanqiao.cn)

思路:

利用交集性质直接求解即可,即最小值大于最大值并且最大值大于最小值

代码:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;

#define INF 0x3f3f3f
double mx1=INF,my1=INF,ax1,ay1;
double mx2=INF,my2=INF,ax2,ay2;
vector<double>res,ans;

int main(){
    for(int i=0;i<2;i++){
        double a,b;
        cin>>a>>b;
        mx1=min(mx1,a);
        my1=min(my1,b);
        ax1=max(ax1,a);
        ay1=max(ay1,b);
    }
   for(int i=0;i<2;i++){
        double a,b;
        cin>>a>>b;
        mx2=min(mx2,a);
        my2=min(my2,b);
        ax2=max(ax2,a);
        ay2=max(ay2,b);
    }
    if((mx2<=ax1&&my2<=ay1)&&(ax2>=mx1&&ay2>=my1)){
        double a1,b1,a2,b2;
        a1=max(mx2,mx1);
        b1=max(my2,my1);
        a2=min(ax1,ax2);
        b2=min(ay1,ay2);
        printf("%.2lf",(a2-a1)*(b2-b1));
    }
    else 
        cout<<"0.00";
    system("pause");
    return 0;
}

矩阵乘法:

原题链接:“蓝桥杯”练习系统 (lanqiao.cn)

思路;

利用矩阵的性质相乘即可,三层循环相乘,因为每一层需要计算n次,顺便对0次阶特判一下即可

代码:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;

#define INF 0x3f3f3f
const int N=35;
vector<vector<int> >res(N,vector<int>(N)),mp(N,vector<int>(N));
vector<int>t;
int n,m;

int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int num;
            cin>>num;
            res[i][j]=mp[i][j]=num;
        }
    }
    if(m>0){
        m--;
        while(m--){
            for(int k=0;k<n;k++){
                for(int i=0;i<n;i++){
                    int sum=0;
                    for(int j=0;j<n;j++){
                        sum+=res[k][j]*mp[j][i];
                    }
                    t.push_back(sum);
                }
                for(int i=0;i<n;i++)
                    res[k][i]=t[i];
                t.clear();
            }
        } 
        for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<res[i][j]<<' ';
        }
        cout<<endl;
        }   
    }    
    else{
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(i==j)
                    cout<<1<<' ';
                else 
                    cout<<0<<' ';
            }
            cout<<endl;
        }
    }
    system("pause");
    return 0;
}

分解质因数:

原题链接:

“蓝桥杯”练习系统 (lanqiao.cn)

思路:

本题数量级1e4,暴力求解即可,质因数的常规求解

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;

int a,b;

void test(int x){
    cout<<x<<'=';
    for(int i=2;i<x;i++){
        while(x){
            if(x%i==0){
                x/=i;
                cout<<i;
                if(x!=1)
                    cout<<'*';
            }
            else 
                break;
        }
    }
    if(x!=1)
        cout<<x<<endl;
    else
        cout<<endl;
}

int main(){
    cin>>a>>b;
    for(int i=a;i<=b;i++){
        test(i);
    }
    system("pause");
}

时间转换:

原题链接:

“蓝桥杯”练习系统 (lanqiao.cn)

 代码:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;

int t;
int H,M,S;

int main(){
    cin>>t;
    while(1){
        if((int)(t/3600)>0){
            H++;
            t-=3600;
        }
        else
            break;
    }
    while(2){
        if((int)(t/60)>0){
            M++;
            t-=60;
        }
        else
            break;
    }
    cout<<H<<':'<<M<<':'<<t;
    system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值