M、A、B、L签到不说。
题目链接:
2018浙江acm省赛
题意:开始的时候读错题意了(我真的是太菜了,学这么多dp,可是都不熟练,啥题都A不掉,菜啊。给一个仅由’(‘与’)’组成的字符串,只有()相连的时候才可以对调位置,每个符号都有其价值,每次移动价值为a[i]*a[i+1],问可以获得的最大价值。
思路:因为第i个括号能获得的最大价值受到第i+1个括号向右移动多少的影响,那么可以得到对于i+1移到右边不同的距离,其第i个移动到一个位置获得的价值有很多种,这里取i+1移动到比i能移动的更右边的最大价值即可。
dp[i][j]表示第i个’字符移到j位置可以获得的最大价值。
那么转移可以为dp[i][j]=dp[i][j]+max(dp[i+1][k]) j
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const ll maxn=1e3+7;
const ll mod = 1e9;
char s1[maxn];
ll dp[maxn][maxn];
ll qq[maxn];
int main()
{
//e满足Note里提到的合法运算式
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
ll i,j;
//ios::sync_with_stdio(false);
ll T,k,t2,t3,t4,f1,f2,f3,f4;
ll r,c;
ll n,m,K;
cin >> T;
ll res;
while(T--){
cin >> n;
cin >> s1;
memset(dp,0,sizeof(dp));
ll len1=strlen(s1);
qq[len1]=qq[len1+1]=0;
for(i=0;i<len1;i++){
scanf("%lld",&qq[i]);
}
for(i=0;i<len1;i++){
if(s1[i]=='('){
res=0;
for(j=i+1;j<len1;j++){
if(s1[j]==')')res+=qq[i]*qq[j];
dp[i][j]=res;
}
}
}
for(i=len1-1;i>=0;i--){
res=-1e9;
for(j=len1-1;j>=i;j--){
res=max(res,dp[i+1][j]);
dp[i][j]=dp[i][j]+res;
}
}
ll Max=0;
for(i=0;i<len1;i++){
Max=max(Max,dp[0][i]);
}
cout << Max << endl;
}
return 0;
}
题意:有n个人,给一个长度为n的01序列,1表示第i个人为男生,0表示第i个人为女生,第i个人拥有价值i的物品,问如何对他们进行分组,使得G1+G3=G2+G4,G1与G2中全为女生,G3与G4中全为男生,如果有分组情况输出分组情况,如果没有直接输出-1。
思路:显然得到一个结论,总价值不为偶数的直接无法满足,那么显然n%4=3或者n%4=0才可以使得结果满足。刚开始相当于把所以女生放在1,把所有男生放在4,问从中拿出哪些男生女生可以使得结果的和为n/2,因为价值是1,2,3,4,。。。n-1,n。那么可以得到如果n%4==0,那么其可以分成n/4对1+n与2+n-1大小的数对,那么只需要把前面的n/4个人与后面的n/4个人分到2与3即可。
如果n%4==3,则相当与把1与(n+1)/2放在左,而(n+1)/2+1放在右。然后剩余的结果又可以%4得到均分。
wa1:超时,memset循环对大数组赋值
源码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
struct ttt{
string s1;
ll score;
};
ttt q1[maxn];
char s1[maxn];
char s2[maxn];
int main()
{
//e满足Note里提到的合法运算式
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
int i,j;
int T,k,t1,t2,t3,t4,f1,f2,f3,f4;
int r,c;
ll n,m,K;
t1=0;
cin >> T;
while(T--){
cin >> n;
cin >> s1;
if(n%4==1||n%4==2){
cout << "-1" << endl;continue;
}
memset(s2,0,sizeof(s2));
if(n%4==0){
t2=n/4;
for(i=0;i<n;i++){
j=i+1;
if(j<=t2||n-i<=t2){
if(s1[i]=='0')
s2[i]='1';
else
s2[i]='3';
}else{
if(s1[i]=='0')
s2[i]='2';
else
s2[i]='4';
}
}
}else{
t2=(n-3)/4+1;
t3=(n+1)/2;
for(i=0;i<n;i++){
j=i+1;
if(j<=t2||j==t3||n-i<t2){
if(s1[i]=='0')
s2[i]='1';
else
s2[i]='3';
}else{
if(s1[i]=='0')
s2[i]='2';
else
s2[i]='4';
}
}
}
cout << s2<< endl;
}
return 0;
}
题意:
给一个序列的数字a1、a2、a3、a4、a5,然后给n组查询p,问每次p的结果。
思路:由公式可知,只有a[i]改变成p的指数的时候,对应其的b[i](这里b[i]指一个公式对应的一个值。
可以先将p排序从大到小,那么此时是那么可以枚举a的n次方根时候的新a[i],如果比p大,那么就更新a的结果,然后改变总结果sum即可。这里更新的方法是,枚举a的n次方根,按大到小排序丢入队列,然后丢进去的时候要记录这个a[i]值为第几次方根即可,对于每个p把大于其的全部更新,然后就得出了这个p的对应这个函数的值。
wa1:取mod问题,是对1e9取模,而不是1e9+7,有点想当然了。
wa2:还是取mod问题,不可以ans+=..%mod这样取模
源码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
const int maxn=5e5+7;
typedef long long ll;
const ll mod = 1e9;
ll q1[maxn];
ll q2[maxn];
struct ttt{
ll pos,num;
double key;
bool operator < (const ttt &b)const{
return key<b.key;
}
};
struct tt1{
ll key;
ll id;
};
tt1 p[maxn];
ll res[maxn];
int cmp1(tt1 x,tt1 y){ //从大开始慢慢递减
return x.key>y.key;
}
int main()
{
//e满足Note里提到的合法运算式
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
ll i,j;
ll T,k,t2,t3,t4,f1,f2,f3,f4;
ll r,c;
ll n,m,K;
double t1;
double g1,g2,g3,g4,g5;
cin >> T;
ll Sum;
ll Res;
while(T--){
cin >> n >> m;
Sum=0;
ttt u;
priority_queue<ttt>G;
for(i=1;i<=n;i++){
scanf("%lld",&q1[i]);
res[i]=1;
Sum+=q1[i];
u.key=q1[i];
u.num=1;
u.pos=i;
G.push(u);
}
Res=0;
ll Minp=2e9+7;
for(i=1;i<=m;i++){
scanf("%lld",&p[i].key);
p[i].id=i;
Minp=min(Minp,p[i].key);
}
sort(p+1,p+1+m,cmp1);
for(i=1;i<=n;i++){
t1=q1[i];
u.pos=i;
for(j=2;j<=35;j++){
g1=j;
g2=pow(t1,1.0/g1); //次方根
if(g2<Minp)break;
u.key=g2; //key=t1 +1
u.num=j;
G.push(u);
}
}
ll gg;
for(i=1;i<=m;i++){
while(!G.empty()){
u=G.top();
if(u.key>p[i].key){
gg=floor(q1[u.pos]/res[u.pos]);
Sum-=gg;
res[u.pos]=u.num+1;
gg=floor(q1[u.pos]/res[u.pos]);
Sum+=gg;
G.pop();
}else{
break;
}
}
Res=(Res+(p[i].id*(Sum%mod))%mod)%mod;
}
cout << Res << endl;
}
return 0;
}
题意:(题意水题,间接说明了English is important。
给3*m个麻将,玩家将会在这3*
m个麻将中选取一个幸运麻将(幸运麻将排在最前面。给n个已经排了序的麻将,问这3*m个麻将中有哪些可能成为幸运的麻将。这里有个门这个麻将,其存在给出的n个麻将中的意义是表明在排序之前,幸运麻将所在的位置。
思路:因为题目给出了排序的方式,那么可以将每个麻将最初的顺序转换为数字的形式去表达。
那么B就是M+Rank,D就是M+M+Rank。那么每个麻将均有一个其排名的数字了,如果第一个数字不是这些数字中最小的,那么说明lucky麻将被选出来了,结果只有一个。如果没被选出来,而结果中没有门这个麻将,那么说明除了这n个以为,所有麻将都有可能被排在第一,当然选出了的第1个也可能,但是选出了的另外n-1个均不可能为lucky麻将。如果有门,那么门左右区间的都可能是lucky麻将,并且如果门前面有且仅一个数字,其也可能是lucky麻将(这里可以参考题目给出的样例
源码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<memory>
#include <queue>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <set>
using namespace std;
const int maxn=2e5+7;
typedef long long ll;
const ll mod = 1e9;
int qq[maxn];
char s1[15];
int main()
{
//e满足Note里提到的合法运算式
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
ll i,j;
ll T,k,t2,t3,t4,f1,f2,f3,f4;
ll r,c;
ll n,m,K;
double t1;
double g1,g2,g3,g4,g5;
cin >> T;
ll Sum;
ll Res;
while(T--){
cin >> n >> m;
int pos=0;
int min1=1e9;
//memset(qq,0,sizeof(qq));
for(i=1;i<=n;i++){
cin >> s1 ;
// cout << s1<< endl;
if(s1[0]=='C'){
qq[i]=0;
}else if(s1[0]=='B'){
qq[i]=m;
}else if(s1[0]=='D'){
qq[i]=m+m;
}else if(s1[0]=='W'){
pos=i;continue;
}
cin >> t2;
qq[i]+=t2;
min1=min(min1,qq[i]);
}
if(pos==1&&n!=1){
cout << qq[2] << endl;continue;
}else if(pos==1){
cout << m << endl;continue;
}
if(min1!=qq[1]){
cout <<"1"<<endl;continue;
}
//cout <<"~666 " << endl;
if(pos==n){
cout << 3*m-qq[n-1]+1 << endl;continue;
}
t1=0;
if(pos==2)
t1=1;
if(pos==0){
cout << 3*m-n+1 << endl;continue;
}else{ //门在中间
cout << qq[pos+1]-qq[pos-1]+t1-1 << endl;continue;
}
}
return 0;
}
文章浏览阅读343次。五种原始的变量类型1.Undefined--未定义类型 例:var v;2.String -- ' '或" "3.Boolean4.Number5.Null--空类型 例: var v=null;Number中:NaN -- not a number非数本身是一个数字,但是它和任何数字都不相等,代表非数,它和自己都不相等判断是不是NaN不能用=_curry函数未定义
文章浏览阅读1.2w次,点赞2次,收藏17次。兑换码编码设计当前各个业务系统,只要涉及到产品销售,就离不开大大小小的运营活动需求,其中最普遍的就是兑换码需求,无论是线下活动或者是线上活动,都能起到良好的宣传效果。兑换码:由一系列字符组成,每一个兑换码对应系统中的一组信息,可以是优惠信息(优惠券),也可以是相关奖品信息。在实际的运营活动中,要求兑换码是唯一的,每一个兑换码对应一个优惠信息,而且需求量往往比较大(实际上的需求只有预期_优惠券编码规则
文章浏览阅读45次。C语言程序设计实训教程教学课件作者周林ch04结构化程序设计课件.ppt* * 4.1 选择结构程序设计 4.2 循环结构程序设计 4.3 辅助控制语句 第四章 结构化程序设计 4.1 选择结构程序设计 在现实生活中,需要进行判断和选择的情况是很多的: 如果你在家,我去拜访你 如果考试不及格,要补考 如果遇到红灯,要停车等待 第四章 结构化程序设计 在现实生活中,需要进行判断和选择的情况..._在现实生活中遇到过条件判断的问
文章浏览阅读999次。幻数使用说明 在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。 因为设备都是特定的,这里也没法说。关键在于怎样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径 。 命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,利_ioctl-number.txt幻数说明
文章浏览阅读399次。键盘按下“Shift+Ctrl+p” 输入: C++Configurations,选择JSON界面做如下改动:1.首先把 “/usr/include”,放在最前2.查看C++路径,终端输入gcc -v -E -x c++ - /usr/include/c++/5 /usr/include/x86_64-linux-gnu/c++/5 /usr/include/c++/5/backward /usr/lib/gcc/x86_64-linux-gnu/5/include /usr/local/_orb-slam3 include 报错
文章浏览阅读129次。本系列的最后一篇,因未有精力写更多的入门教程,上篇已经抛出书单,有兴趣的朋友可阅读好书来成长,此系列主讲有理由爱Sqlserver的论证性文章,希望读者们看完后,可自行做出判断,Sqlserver是否真的合适自己,目的已达成。渴望自动化及使用场景笔者所最能接触到的群体为Excel、PowerBI用户群体,在Excel中,我们知道可以使用VBA、VSTO来给Excel带来自动化操作..._sqlsever 数据分析
文章浏览阅读294次,点赞6次,收藏4次。教育智脑)建立学校的全连接中台,对学校运营过程中的数据进行处理和标准化管理,挖掘数据的价值。能:一、原先孤立的系统聚合到一个统一的平台,实现单点登录,统一身份认证,方便管理;三、数据共享,盘活了教育大数据资源,通过对外提供数。的方式构建教育的通用服务能力平台,支撑教育核心服务能力的沉淀和共享。物联网将学校的各要素(人、机、料、法、环、测)全面互联,数据实时。智慧校园解决方案,赋能教学、管理和服务升级,智慧教育体系,该数据平台具有以下几大功。教育大数据平台底座:教育智脑。教育大数据平台,以中国联通。_高校智慧大脑
文章浏览阅读9.5k次,点赞2次,收藏27次。分治法,动态规划法,贪心算法这三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。但其实这三者之间的区别还是蛮大的。贪心是则可看成是链式结构回溯和分支界限为穷举式的搜索,其思想的差异是深度优先和广度优先一:分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两_算法概念实例
文章浏览阅读5.6k次。考研篇emmmmm,这是我随笔篇章的第二更,原本计划是在中秋放假期间写好的,但是放假的时候被安排写一下单例模式,做了俩机试题目,还刷了下PAT的东西,emmmmm,最主要的还是因为我浪的很开心,没空出时间来写写东西。 距离我考研结束已经快两年了,距离今年的考研还有90天左右。 趁着这个机会回忆一下青春,这一篇会写的比较有趣,好玩,纯粹是为了记录一下当年考研中发生的有趣的事。 首先介绍..._考研调剂抑郁
文章浏览阅读438次。SpringMVC文章目录SpringMVC1、SpringMVC简介1.1 什么是MVC1.2 什么是SpringMVC1.3 SpringMVC的特点2、HelloWorld2.1 开发环境2.2 创建maven工程a>添加web模块b>打包方式:warc>引入依赖2.3 配置web.xml2.4 创建请求控制器2.5 创建SpringMVC的配置文件2.6 测试Helloworld2.7 总结3、@RequestMapping注解3.1 @RequestMapping注解的功能3._class org.springframework.web.filter.characterencodingfilter is not a jakart
文章浏览阅读4.9k次。gdb 远程调试的一个问题:Don't know how to run. Try "help target".它在抱怨不知道怎么跑,目标是什么. 你需要为它指定target remote 或target extended-remote例如:target extended-remote 192.168.1.136:1234指明target 是某IP的某端口完整示例如下:targ..._don't know how to run. try "help target".
文章浏览阅读85次。习题 11、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述2、c 语言程序的结构如下:1、c 语言程序由函数组成,每个程序必须具有一个 main 函数作为程序的主控函数。2、“/*“与“*/“之间的内容构成 c 语言程序的注释部分。3、用预处理命令#include 可以包含有关文件的信息。4、大小写字母在 c 语言中是有区别的。5、除 main 函数和标准库函数以..._c语言语法0x1e