EOJ Monthly 2020.7 Sponsored by TuSimple(A 签到 B 签到 C 思维+二维前缀和 E dfs 构造)

本文主要是介绍EOJ Monthly 2020.7 Sponsored by TuSimple(A 签到 B 签到 C 思维+二维前缀和 E dfs 构造),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

A. 打字机

做法:签到题,对b进行 a 的匹配。类似括号匹配的做法。若有匹配则看最后一个b的前面a的数量是否比b 是 输出 Happy Fang否 输出 Sad Fang。

若匹配失败 输出 Dead Fang 。

特判断全a的情况

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define per(i,a,b) for(int i=a;i>=(b);--i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb emplace_back
#define pii pair<int,int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline ll read()
{ll x=0,w=1; char c=getchar();while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}return w==1?x:-x;
}
const int N=1e6+10;
char s[N];
int dp[N][2];
int main()
{int _ =read();while(_--){scanf("%s",s+1);int len = strlen(s + 1);rep(i,1,len){rep(j,0,1) dp[i][j]=dp[i-1][j];if(s[i]=='a') dp[i][0]++;else dp[i][1]++;}if(dp[len][1]==0){puts("Happy Fang");continue;}int flag=1,f=0;for(int i=len;i>=1;--i){if(s[i]=='b'){if(dp[i][0]>dp[i][1]) f=1;if(dp[i][0]<dp[i][1]) flag=0;break;}}int num=0;for(int i=1;i<=len&&flag;++i){if(s[i]=='a') num++;else {if(num) num--;else flag=0;}}if(flag){if(!f) puts("Happy Fang");else puts("Sad Fang");}else puts("Dead Fang");}
}

B. 线上考试

签到题。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define per(i,a,b) for(int i=a;i>=(b);--i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb emplace_back
#define pii pair<int,int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline ll read()
{ll x=0,w=1; char c=getchar();while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}return w==1?x:-x;
}
int main()
{int n =read();int ans = 0;rep(i,1,n){string s;int x;cin>>s>>x;if(s[0]=='S') ans=max(ans,x);else ans=max(ans,(1<<x)-1);}cout<<ans<<endl;
}

C. OLED

做法:对矩阵屏保 的每一个1 计算 他能在屏幕中对所有 位置的贡献(+1)。然后取屏幕中贡献值最大的为100.  其他按照贡献值比例 乘 100即可。二维前缀和 即可

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define per(i,a,b) for(int i=a;i>=(b);--i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb emplace_back
#define pii pair<int,int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline ll read()
{ll x=0,w=1; char c=getchar();while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}return w==1?x:-x;
}
ll dp[4000][2200];
int n,m,a,b;
ll c[4000][2200];
int main()
{a = read(), b = read(), n = read(), m = read();rep(i, 1, a) rep(j, 1, b) c[i][j] = read();rep(i, 1, a) {rep(j, 1, b) {if(c[i][j]) {int l=n-(a-i+1)+1;int r=m-(b-j+1)+1;dp[i][j]++;dp[i][r+1]--;dp[l+1][j]--;dp[l+1][r+1]++;//printf("i:%d j:%d l:%d r:%d\n", i, j, l, r);}}}ll ans=0;rep(i, 1, n){rep(j, 1, m){dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];ans=max(ans,dp[i][j]);}}//    rep(i, 1, n)
//    {
//        rep(j, 1, m) {
//            printf("%lld ",dp[i][j]);
//        }
//        puts("");
//    }rep(i, 1, n){rep(j, 1, m) {printf("%lld ",(dp[i][j]*100)/ans);}puts("");}}
/*
2 2 4 4
1 0
0 0
*/

E. 因数串

做法:很显然是 各自素数 的 幂次方 组合一下,每次 每个幂方 之和 大小 改变为1

对于样例:

2^03^0=>2^03^1=>2^03^2=>2^13^2=>2^13^1=>2^13^0=>2^23^0=>2^23^1=>2^23^2=>2^33^2=>2^33^1=>2^33^0

可以得到一个规律:dfs时,每个素数的幂次方 是 先增  后 减 再增的。于是记录每个素数当前版本值。版本值 为偶数时 幂次方的值就递增。奇数就递减。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define per(i,a,b) for(int i=a;i>=(b);--i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb emplace_back
#define pii pair<int,int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
inline ll read()
{ll x=0,w=1; char c=getchar();while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}return w==1?x:-x;
}
const int N=20;
int n;
ll dp[N][62];
int num[N];
int t[N];
deque<ll>G[200];
void dfs(int id,ll now,int flag,int pre)
{if(id>n) {G[flag].push_back(now);printf("%lld\n",now);return ;}//printf("id:%d dp:%lld\n",id,dp[id][1]);if(t[id]%2==0){for(int i=0;i<=num[id];++i){dfs(id+1,now*dp[id][i],flag+i,i);}t[id]++;}else{for(int i=num[id];i>=0;--i){dfs(id+1,now*dp[id][i],flag+i,i);}t[id]++;}}
int main()
{n=read();rep(i,1,n) dp[i][0]=1,dp[i][1]=read(),num[i]=read();rep(i,1,n){rep(j,2,num[i]) dp[i][j]=dp[i][j-1]*dp[i][1];}dfs(1,1,0,0);}

 

这篇关于EOJ Monthly 2020.7 Sponsored by TuSimple(A 签到 B 签到 C 思维+二维前缀和 E dfs 构造)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703466

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

ural 1149. Sinus Dances dfs

1149. Sinus Dances Time limit: 1.0 second Memory limit: 64 MB Let  An = sin(1–sin(2+sin(3–sin(4+…sin( n))…) Let  Sn = (…( A 1+ n) A 2+ n–1) A 3+…+2) An+1 For given  N print  SN Input One

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访