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;
}
大佬源代码:
#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;
}