本文共 4893 字,大约阅读时间需要 16 分钟。
A
题目大意
给你一个合法的括号序列,每次操作分两步,第一步删除第一个左括号,第二步删除某一个右括号,要保证删除之后的括号序列还是合法的,求将括号删到空为止一共有多少种不同的删除方法,两种方法不同当且仅当存在某一步右括号的删除位置不同,答案膜1e9+7
题解
贪心,直接遍历,数据量大用long long 遇到左括号让当前方案数+1 如果遇到右括号 左右括号删除 sum要乘上当前方案数
#includeusing namespace std;typedef long long ll;const int mod=1e9+7;const int maxn=2500+10;char ss[maxn];int main(){ ll sum=1; scanf("%s",ss); int len=strlen(ss); int ans=0; for(int i=0;i
B
题目大意
小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。 小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。 障碍物不能通过。小明如果现在在点(x,y)处,那么下一步只能走到相邻的四个格子中的某一个:(x+1,y),(x-1,y),(x,y+1),(x,y-1); 小明想要知道,现在他能否从起点走到终点。
题解
直接模板dfs爆搜 剪枝条件很常规
#include#define mst(a,b) memset(a,b,sizeof(a))using namespace std;const int maxn=500+10;char mp[maxn][maxn];int n,m;int sx,sy;int vis[maxn][maxn];int dx[]={ 1,0,-1,0};int dy[]={ 0,1,0,-1};bool judge(int x,int y){ if(!vis[x][y]&&mp[x][y]!='#'&&x>=0&&x =0&&y >n>>m){ mst(vis,0); for(int i=0;i >mp[i][j]; if(mp[i][j]=='S') sx=i,sy=j; } } if(dfs(sx,sy)) cout<<"Yes"<
C
题目大意
就是为了让你简便他的运算方式 从小到大
题解
只要是数字就用另一个数组存起来 然后从小到大排一下序 注意最后输出方式即可
#includeusing namespace std;const int maxn=200+10;int n;char s[maxn];char ss[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>s){ int n=strlen(s); int k=0; for(int i=0;i ='0'&&s[i]<='9'){ ss[k++]=s[i]; } } sort(ss,ss+k); for(int i=0;i
D
题目大意
让骨牌m x n 场地内放最多数目
题解
此题关键在于两边都是奇数边的时候,贪心策略在于尽量让偶数变与骨牌的2平行 这样可以最大化 一般情况就是(m*n)>>1 但是对于特殊情况:两边都为奇数时,由于n≥m 优先考虑n 让骨牌的2与列平行 可以推出 (m-1) * n / 2 + (n - 1 ) / 2 化简得到(n * m - 1) / 2
其实就是(n*m)>>1 公式一出来 完全就是水题了
#includeusing namespace std;int main(){ int n,m; cin>>n>>m; cout<<((n*m)>>1)<
E
题目大意
匹配" hello "
题解
用另一个数组存hello 然后爆搜
#includeusing namespace std;const int maxn=100+10;char s[maxn];char ss[]="hello";int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>s){ int n=strlen(s); int k=0; for(int i=0;i
F
题目大意
双胞胎,一个想拿更多的钱,但是又想让硬币最少化
题解
将硬币的价值从大到小排序,然后贪心拿,如果发现当前的价值已经超过了总价值的一半就结束贪心
#includeusing namespace std;const int maxn=100+10;int a[maxn];int n,sum,ans;int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){ sum=0,ans=0; for(int i=0;i >a[i]; sum+=a[i]; } sort(a,a+n,greater ()); int cnt=0; for(int i=0;i sum) break; } cout< <
G
题目大意
想将盒子里的方块移动位置
题解
结合题意,排一下序就好了
#includeusing namespace std;const int maxn=100+10;int n,a[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){ for(int i=0;i >a[i]; sort(a,a+n); for(int i=0;i
H
题目大意
n个同学,m个礼物,求买的这n个礼物里面最高价格和最低价格之差的最小值
题解
排序一下,然后找出n个礼物,遍历求最高与最低价格之差,求出min值
#includeusing namespace std;const int maxn=100+10;int n,m,a[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>n>>m){ for(int i=0;i >a[i]; sort(a,a+m); int remax=100000; for(int i=0;i
I
题目大意
给你一个n 让你最后判断那两个人能否完成1-n水平
题解
相当于区间汇合,最后判断1-n是否都有
#includeusing namespace std;const int maxn=100+10;int n,m,x,a[maxn];int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){ cin>>m; for(int i=0;i >x; a[x]++; } cin>>m; for(int i=0;i >x; a[x]++; } int ff=1; for(int i=1;i<=n;i++){ if(!a[i]){ ff=0; break; } } if(ff) cout<<"I become the guy."<<"\n"; else cout<<"Oh, my keyboard!"<<"\n"; } return 0;}
J
题目大意
有n团小朋友,每一团都是1-4人,每辆车最多装4人,要你求怎样装才能使车子的数量最少?
题解
采用贪心思想,从大到小先排序,准备一个头指针和一个尾指针,一头一尾,头指向人数较多的一组,尾指向人数较少的一组,如果当前两者相加比4大,说明头的这一组可以单独租一辆车,即cnt++(车辆数加1),i++(头指针往后移一位),尾指针不用处理;
如果当前两者相加和不大于4,即sum<=4,车辆数先加1,同时尾指针往前移一位,因为移后尾指针指向(原来一组的前一组)当前一组的人数可能还可以凑合成一辆车,于是贪心往前,直到大于4为止。
这样当头指针比尾指针还小时,说明已经实现了贪心策略,此时的cnt即为最少车辆数。
#includeusing namespace std;const int maxn=1e5+10;int a[maxn],n;int main(){ ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){ for(int i=0;i >a[i]; int t=n; int sum=0,cnt=0; sort(a,a+n,greater ()); for(int i=0;i 4) ++cnt; else{ ++cnt; --t; while(sum+a[t-1]<=4){ sum+=a[t-1]; --t; } } } cout< <
学如逆水行舟,不进则退
转载地址:https://chocolate.blog.csdn.net/article/details/100586556 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!