哈尔滨理工大学软件学院ACM程序设计全国邀请赛【不断更新】

C:给定N和M,要求用N个数,这些数的和要能够覆盖1~M中的所有数,求这些数的方案总数

看到N和M最大200,猜想是打表,但是没想明白怎么搞:看到标程,一眼题


dp【i】【j】【k】:用i个数,这些数的和要能够覆盖1~M中的所有数,其中最大数是k

要求最后的答案ans=dp【n】【m】【1】+dp【n】【m】【2】+dp【n】【m】【3】+……+dp【n】【m】【m】

转移怎么想呢:

枚举可以取到的最大值,至少为k,最大为j+1,还要满足和不超过极限值200的条件

所以,全部可以提前打表预处理好的

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

#define LL long long
#define mod 2000000007

const int maxn=220;
LL dp[maxn][maxn][maxn],ans;
int T,n,m;

int main(){
    memset(dp,0,sizeof(dp));
    dp[1][1][1]=1;
    for(int i=1;i<=200;i++)
        for(int j=1;j<=200;j++)
            for(int k=1;k<=200;k++){
                if (dp[i][j][k]==0) continue;
                for(int Max=k;Max+j<=200&&Max<j+2;Max++)
                    dp[i+1][j+Max][Max]=(dp[i+1][j+Max][Max]+dp[i][j][k])%mod;
            }
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        ans=0;
        for(int Max=1;Max<=m;Max++)
            ans=(ans+dp[n][m][Max])%mod;
        printf("%lld\n",ans);
    }
    return 0;
}



E:求有多少个连续区间里,全部是6

直接从前到后扫描一遍就好了,注意int和long long

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

#define LL long long

const int maxn=2e5+50;

char s[maxn];
LL ans;
int T,n,num;

int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%s",&n,s);
        ans=0;num=0;
        for(int i=0;i<n;i++){
            if (s[i]=='6') num++;
            else num=0;
            ans+=num;
        }
        printf("%lld\n",ans);
    }
    return 0;
}


L题先给题目一个好评,再给自己一个中评,分析:
看到这种四个这么大的数字,而且还有非法的情况-1要判断,肯定是个构造题(想到了可怕的青岛B题魔方)这种题分析思路更重要吧,写出心路历程


首先,a3和a4比较重要,因为判断构造的形式


如果a3=a4,68686或者86868都可以
如果a3=a4+1,那么68要比86多一个,686868这样的
如果a4=a3+1,那么868686这样的


我们不能一直这样分类下去:在尝试无法构造其他的可能情况下,试图证明:
假设a3=a4+2,那么必须要出现6868这种的两个子段,那么用什么数字连接呢?
686866868和686886868,注意:这是可能的两种连接方式,但是,都会产生出来一个86!所以,不能出现a3>=a4+2的情况,同理对称的情况就不会出现了

总情况分类就是上面的三种:接下来需要数数,判断6和8的个数是不是可以满足至少的要求!
多的8是尽可能放在后面的,多的6是尽可能放在前面的(废话:因为要求数最小)


有了这些,分类打表就不难处理了

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

int a1,a2,a3,a4;

int main(){
	while(scanf("%d%d%d%d",&a1,&a2,&a3,&a4)!=EOF){
		if (abs(a3-a4)>1) puts("-1");
		else if (a3==a4){
			if (a1>a3&&a2>=a3){
				for(int i=1;i<=a1-a3;i++) printf("6");
				for(int i=1;i<a3;i++) printf("86");
				for(int i=1;i<=a2-a3;i++) printf("8");
				puts("86");
			}
			else if (a1>=a3&&a2>a3){
				printf("86");
				for(int i=1;i<=a1-a3;i++) printf("6");
				for(int i=1;i<a3;i++) printf("86");
				for(int i=1;i<=a2-a3;i++) printf("8");
				puts("");
			}
			else puts("-1");
		}
		else if (a3==a4+1){
			if (a1>=a3&&a2>=a3){
				for(int i=1;i<=a1-a3;i++) printf("6");
				for(int i=1;i<=a3;i++) printf("68");
				for(int i=1;i<=a2-a3;i++) printf("8");
				puts("");
			}
			else puts("-1");
		}
		else if (a4==a3+1){
			if (a1>=a4&&a2>=a4){
				printf("86");
				for(int i=1;i<=a1-a4;i++) printf("6");
				for(int i=1;i<=a4-2;i++) printf("86");
				for(int i=1;i<=a2-a4;i++) printf("8");
				puts("86");
			}
			else puts("-1");
		}
	}
	return 0;
}


全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442727次浏览 4513人参与
# 春招别灰心,我们一人来一句鼓励 #
42019次浏览 533人参与
# 北方华创开奖 #
107444次浏览 599人参与
# 地方国企笔面经互助 #
7965次浏览 18人参与
# 同bg的你秋招战况如何? #
76850次浏览 564人参与
# 实习必须要去大厂吗? #
55781次浏览 961人参与
# 阿里云管培生offer #
120306次浏览 2220人参与
# 虾皮求职进展汇总 #
115819次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11607次浏览 288人参与
# 实习,投递多份简历没人回复怎么办 #
2454766次浏览 34858人参与
# 提前批简历挂麻了怎么办 #
149907次浏览 1977人参与
# 在找工作求抱抱 #
906039次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4759次浏览 55人参与
# 你投递的公司有几家约面了? #
33207次浏览 188人参与
# 投递实习岗位前的准备 #
1195967次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157638次浏览 2267人参与
# 双非本科求职如何逆袭 #
662289次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12764次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35833次浏览 384人参与
# 简历中的项目经历要怎么写? #
86924次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20137次浏览 240人参与
# 我的上岸简历长这样 #
452024次浏览 8088人参与
牛客网
牛客企业服务