OJ基础题库(5)

P1208 采药

P1296 分形宇宙

P1490 机器人捡垃圾

P1384 睡神

P1420 好好做题

P1473 埃及分数

P1475 智力大冲浪

P1401 矩阵连乘问题

源代码部分:

#include<stdio.h>
int main(){
	int t,m;
	while(~scanf("%d%d",&t,&m)){
		int a,b,value[1001]={},i;
		while(m--){
			scanf("%d%d",&a,&b);
			int j;
			for(j=t-a;j>-1;j--)
				if(value[j]+b>value[j+a])
					value[j+a]=value[j]+b;
		}
		printf("%d\n",value[t]);
	}
	return 0;
}

源代码部分:

#include<stdio.h>
char a[777][777];
const int exp3[]={0,1,3,9,27,81,243,729};
void fill(int x,int y,int size,int space){
	int i,j;
	if(space){
		for(i=0;i<exp3[size];i++)
			for(j=0;j<exp3[size];j++)
				a[x+i][y+j]=' ';
		return;
	}
	if(size==1){
		a[x][y]='X';
		return;
	}
	fill(x,y,size-1,0);
	fill(x,y+exp3[size-1],size-1,1);
	fill(x,y+2*exp3[size-1],size-1,0);
	fill(x+exp3[size-1],y,size-1,1);
	fill(x+exp3[size-1],y+exp3[size-1],size-1,0);
	fill(x+exp3[size-1],y+2*exp3[size-1],size-1,1);
	fill(x+2*exp3[size-1],y,size-1,0);
	fill(x+2*exp3[size-1],y+exp3[size-1],size-1,1);
	fill(x+2*exp3[size-1],y+2*exp3[size-1],size-1,0);
}
int main(){
	int n;
	while(~scanf("%d",&n)){
		fill(0,0,n,0);
		int i,j;
		for(i=0;i<exp3[n];i++){
			for(j=0;j<exp3[n];j++)
				printf("%c",a[i][j]);
			printf("\n");
		}
		printf("-\n");
	}
	return 0;
}

算法核心思想:动态规划思想

源代码部分:

/*机器人捡垃圾*/
#include<bits/stdc++.h>
#define MAX 200
using namespace std;
int main(){
	int n,m;
	while(cin>>n>>m){
		long long a[MAX][MAX]; //存储矩阵的值
		long long f[MAX][MAX]; //用于存储当前捡的最多的垃圾数量
		for(int i=1;i<=n;i++)  //初始化矩阵的值 
			for(int j=1;j<=m;j++) 
				cin>>a[i][j];
		for(int i=1;i<=n;i++)  //求最多捡到的垃圾 
			for(int j=1;j<=m;j++)
				f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];
		cout<<f[n][m]<<endl;
	}
	return 0;
}

接下来这道题比较弱智 没有什么参考价值 看着图个乐就行

源代码部分:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	while(cin>>n){
		int a[n];int sum=0;
		for(int i=0;i<n;i++) { cin>>a[i]; sum+=a[i];}
		if(sum>=25) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

题目简析:n个人做m道题目,每个人做一道。要求每道题至少被做过一次。问有多少种做题方案

据说很复杂 直接参考大佬的代码:

地址:NUISTOJ/P1420 好好做题_ks_deer的博客-CSDN博客

//直接一波预处理就可以了,接下来的答案就是随便获取了//减少时间复杂度。
#include <iostream>
#include <cstring>
#include <cstdio>
#define gei_ye_si 555
#define gei_ye_pa 103
void jiafa(char *a1,char *a2);
void chenfa(char *a1,char *a2);
char ress[gei_ye_si];
using namespace std;
struct Bignum{
    char sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[gei_ye_si];
}shit[gei_ye_pa][gei_ye_pa];
int main(void){
    for(int i = 0; i < gei_ye_pa; i++){
        for(int j = 0; j < gei_ye_pa; j++){
            shit[i][j].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[0]='0';
            shit[i][j].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[1]=0;
        }
    }
    shit[0][0].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[0]='1';
    shit[0][0].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[1]='\0';
    for(int i = 1; i < gei_ye_pa; i++){
        for(int k = 1; k < gei_ye_pa; k++){
            int j = k;
            if(k > i){
                shit[i][k].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[0]='0';
                shit[i][k].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi[1]='\0';
                continue;
            }
            char fuck[gei_ye_si];
            if(j>=1&&j<=9){
                fuck[0]=j+'0';
                fuck[1]='\0';
            }else if(j >= 10 && j <= 99){
                fuck[1]=j%10+'0';
                j/=10;
                fuck[0]=j%10+'0';
                fuck[2]='\0';
            }else{
                fuck[2]=j%10+'0';
                j/=10;
                fuck[1]=j%10+'0';
                j/=10;
                fuck[0]=j%10+'0';
                fuck[3]='\0';
            }
            memset(ress,0,sizeof(ress));
            ress[0]='0';
            chenfa(fuck,shit[i-1][k].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi);
            jiafa(ress,shit[i-1][k-1].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi);
            strcpy(shit[i][k].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi,ress);
        }
    }
    int n,m;
    /****************************
    加法高精度测试数据。
    char a1[555]="9999999999999";
    char a2[555]="9999999999999";
    加法高精度测试数据。
    jiafa(a1,a2);
    cout << a1 << endl;
    ******************************/
    /**********************
    char a1[555] = "41341";
    char a2[555] = "34316";
    chenfa(a1,a2);
    cout << a1 << endl;
    高精度乘法测试
    **********************/
    while(cin >> n >> m){
        cout << shit[n][m].sha_bi_gao_jing_du_gei_ye_pa_cao_ni_ma_bi << endl;
    }
    return 0;
}
void jiafa(char *a,char *b){
    //结果保存在a里面
    int lena = strlen(a);//a数字的长度
    int lenb = strlen(b);//b数字的长度
    //接下来倒过来存,开两个新数组吧
    int a1[gei_ye_si],b1[gei_ye_si];
    memset(a1,0,sizeof(a1));
    memset(b1,0,sizeof(b1));
    //开始把a倒着存到a1里面
    int k = 0;
    for(int i=lena-1;i>=0;i--) a1[k++]=a[i]-'0';
    k=0;
    for(int i=lenb-1;i>=0;i--) b1[k++]=b[i]-'0';
    //倒着存储完毕,开始进行加法操作
    bool j = false;
    int len = lena>lenb?lena:lenb;
    for(int i=0;i<len;i++){
        a1[i+1] += j = (a1[i]+b1[i])/10;
        a1[i] = (a1[i]+b1[i])%10;
    }
    //将答案存到a中,顺着存
    int p = 0;
    if(j){//j=true代表进位了
        for(int i = len; i >= 0; i--){
            ress[p++] = a1[i]+'0';
        }
    }else{
        for(int i = len-1; i >= 0; i--){
            ress[p++] = a1[i]+'0';
        }
    }
    ress[p]=0;
    return;
}
void chenfa(char *a,char *b){
    int lena = strlen(a);
    int lenb = strlen(b);
    int a1[gei_ye_si],b1[gei_ye_si];
    int ans[gei_ye_si];
    memset(ans,0,sizeof(ans));
    int k = 0;
    for(int i=lena-1;i>=0;i--) a1[k++]=a[i]-'0';
    k=0;
    for(int i=lenb-1;i>=0;i--) b1[k++]=b[i]-'0';
    if(a1[lena-1] ==0 || b1[lenb-1] == 0){
        a[0] ='0';
        a[1] = 0;
    }
    //倒着存储完毕!!开始乘法操作,双重循环
    int pos=0;
    for(int i=0;i<lenb;i++){
        pos=i;
        for(int j=0;j<lena;j++){
            ans[pos] += (b1[i]*a1[j])%10;
            ans[pos+1] += (b1[i]*a1[j])/10;
            if(ans[pos] >= 10){
                ans[pos+1] += ans[pos]/10;
                ans[pos] = ans[pos]%10;
            }
            if(ans[pos+1] >= 10){
                ans[pos+2] += ans[pos+1]/10;
                ans[pos+1] %= 10;
            }
            pos++;

        }
    }
    while(ans[pos]==0) pos--;
    if(ans[pos]>=10){
        ans[pos] = ans[pos]%10;
        ans[pos] += ans[pos]/10;
    }
    int p = 0;
    for(int k = pos; k >=0; k--){
        ress[p++] = ans[k]+'0';
    }
    ress[p]=0;
    return;
}

大佬源代码:

链接:P1473 埃及分数_Crush Like a Rush的博客-CSDN博客_埃及分数

#include <bits/stdc++.h>
typedef long long ll;
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=10086;

string make_it_string(int k) {
	int reverse[maxn]={0},len=0;
	string to;
	while (k) reverse[len]=k%10,k/=10,len++;
	for(int i=len-1;i>=0;i--) to+=(reverse[i]+'0');
	return to;
}
int find_frac(int &n,int &m){
	int k=m/n+1;
	int factor=__gcd(n*k-m,m*k);
	n=(n*k-m)/factor,m=m*k/factor;
	return k;
}
int main(){
	int n,m;
	while (cin>>n>>m) {
		int f=0,fl=1;
		string ans;

		// do not forget this simplification ,in case n==m
		int _=__gcd(n,m);
		n/=_,m/=_;
	
		while (n!=1) {
			int k=find_frac(n,m);
			if(k<1) {std::cout << "No found!" << '\n';fl=0;break;}
	
			ans+=(f?"+":"");
			ans+="1";
			ans+="/"+make_it_string(k);
	
			if(!f) f=1;
		}
		if(n==1) {
			ans+=(f?"+":"");
			ans+="1";
			ans+="/"+make_it_string(m/n);
		}
	
		if(fl) std::cout << ans << '\n';
	}
	return 0;

}

大佬源代码:

参考链接:学校oj上的两道题目(有关贪心算法) - 知乎

#include<algorithm>
#include<iostream>
#include<cstdio>
#define N 600
using namespace std;

typedef struct{
int dl=-1,t=-1,fl=0,val=0;
} Game;
//t代表做的时刻 dl代表deadline 
//定义结构体Game fl=0不做 
//t=-1也代表不做 
bool st(Game p,Game q){return p.val>=q.val;}
//比较函数 
//按从大到小 
int select(int *p,int n){
int i;
for(i=n;i>=0&&p[i]==1;i--);
return i;
}
//返回选择时段 

void dispG(Game *G,int n){
int i=0;
for (i=0;i<n;i++)
cout<<G[i].dl+1<<" "<<G[i].t+1<<" "<<G[i].val<<endl;
}
//打印Game 
int main(){
Game G[N];
int m,n,temp,temp2;
while(cin>>m>>n)
{
	int i,Time[N]={0};//某时刻做or不做 
	int sum=0;
	for (i=0;i<n;i++)
		{cin>>temp;G[i].dl=temp-1;}
	for (i=0;i<n;i++)
		cin>>G[i].val;
	sort(G,G+n,st);	
	for (i=0;i<n;i++)
	{
		temp2=select(Time,G[i].dl);
		G[i].t=temp2;
		Time[temp2]=1;
	}
	/*
	dispG(G,n);
	for (i=0;i<n;i++)
	cout<<Time[i]<<endl; 
	*/
	for(i=0;i<n;i++)
	{
		if(G[i].t==-1)
		sum+=G[i].val;
	}
	cout<<m-sum<<endl;	
}
return 0;	
}

大佬源代码:

参考链接:P1401 矩阵连乘问题_Crush Like a Rush的博客-CSDN博客

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+6;
struct sq{
    int r,c;
}s[maxn];
ll  a[maxn],dp[maxn][maxn];
int main(int argc, char const *argv[]) {
    int n;
    while (scanf("%d",&n)!=EOF) {
        memset(dp,0,sizeof dp);
        int flag=0;
        for(int i=0;i<n;i++){
            scanf("%d %d",&s[i].r,&s[i].c);
        }
        a[0]=s[0].r;
        for(int i=1;i<n;i++){
            if(s[i].r!=s[i-1].c) {flag=1;break;}
            a[i]=s[i].r;
        }
        a[n]=s[n-1].c;
        if(flag) {std::cout << "invalid argument" << '\n';continue;}
        for(int cnt=2;cnt<=n;cnt++){
            for(int i=0;i+cnt<=n;i++){
                int j=i+cnt;
                dp[i][j]=dp[i][j-1]+a[i]*a[j-1]*a[j];
                for(int k=i+1;k<j;k++){
                    dp[i][j]=min(a[i]*a[k]*a[j]+dp[i][k]+dp[k][j],
                        dp[i][j]);
                }
            }
        }
        std::cout <<dp[0][n] << '\n';
    }
    return 0;
}

  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simon_Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值