AtCoder Beginner Contest 274「A」「B」「C dfs」「D 暴力dp?」「E 旅行商状压dp」「F 排序」
admin
2024-01-17 14:54:24
0次

AtCoder Beginner Contest 274

A - Batting Average

题目描述:

输出 ba\frac{b}{a}ab​,保留3位小数

#include 
using namespace std;#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef pair  pii;#define MAX 300000 + 50
int n, m, k, x;
int tr[MAX];void work(){double a, b;cin >> a >> b;printf("%.3f\n",b/a);
}int main(){io;work();return 0;
}

B - Line Sensor

题目描述:

输入一个n*m的字符串矩型,输出每一列的#的数量

#include 
using namespace std;#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef pair  pii;#define MAX 300000 + 50
int n, m, k, x;
char p;
int num[MAX];void work(){cin >> n >> m;for(int i = 1; i <= n; ++i){for(int j = 1; j <= m; ++j){cin >> p;num[j] += (p == '#');}}for(int i = 1; i <= m; ++i)cout << num[i] << ' ';}int main(){io;work();return 0;
}

C - Ameba

题目描述:

给定一个长度为n的序列,现在有一个空树,只有一个根结点1,a[i]表示在第i秒产生两个最新的子节点,编号取未出现的最新的俩,输出1-2*n-1的每个点到根节点的距离

思路:

建好图以后dfs一次就行

#include 
using namespace std;#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef pair  pii;#define MAX 500000 + 50
int n, m, k, x;
char p;
int num[MAX];
vectorG[MAX];void dfs(int u, int fa){num[u] = num[fa] + 1;for(auto v : G[u]){if(v == fa)continue;dfs(v, u);}
}void work(){cin >> n;int tot = 1;for(int i = 1; i <= n; ++i){cin >> x;++tot;G[x].push_back(tot);G[tot].push_back(x);++tot;G[x].push_back(tot);G[tot].push_back(x);}dfs(1, 0);for(int i = 1; i <= tot; ++i)cout << num[i] - 1<< endl;
}int main(){io;work();return 0;
}

D - Robot Arms 2

题目描述:

在一个二维平面,起点是(0,0),给你n个数字,表示每次移动的距离,且第一次必须是往右移动,将所有相邻的点连起来,要保证相邻的线之间的夹角是90度,问是否存在一条路径能到达(x,y)

思路:

由于要保证相邻的线之间的夹角是90度,也就说明了i是奇数的时候只能左右走,i是偶数的时候只能上下走,我们就可以分开考虑

现在就可以把题目转换成:

在一个数轴上,你最开始位于ar[1]的位置,可以进行m次移动,每次移动只能往左或者往右移动,问能不能到达x

数据范围不大,我们开一个map暴力更新就行

#include 
using namespace std;#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef pair  pii;#define MAX 300000 + 50
int n, m, k, x, y;
int tr[MAX];void work(){cin >> n >> x >> y;for(int i = 1; i <= n; ++i){cin >> tr[i];}vectorar, br;for(int i = 2; i <= n; i += 2)ar.push_back(tr[i]);for(int i = 3; i <= n; i += 2)br.push_back(tr[i]);mapmp1;mp1[0] = 1;for(auto x : ar){mapmp;for(int j = -10000; j <= 10000; ++j){if(mp1.count(j)){mp[j-x] = 1;mp[j+x] = 1;}}mp1 = mp;for(auto [x,y] : mp)mp1[x] = 1;}mapmp2;mp2[tr[1]] = 1;for(auto x : br){mapmp;for(int j = -10000; j <= 10000; ++j){if(mp2.count(j)){mp[j-x] = 1;mp[j+x] = 1;}}mp2 = mp;}if(mp1[y] && mp2[x])cout << "Yes\n";else cout << "No\n";
}int main(){io;work();return 0;
}

E - Booster

题目描述:

二维平面,给出n个城镇的坐标,和m个宝箱的坐标,每拿到一个宝箱,就会使得自己的移动速度翻倍,你从(0,0),必须要经过n个城镇,宝箱不做要求,问回到(0,0)的最短时间是多少,初始速度是1

思路:

壮压dp

dp[i][j]表示状态为i,且当前在j的最短时间,

i是长度为n+m的二进制数,每个是1的位置的点表示已经去过了,前m个是包箱,后n个是城镇

然后就是简单的转移

#include 
using namespace std;#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef pair  pii;#define MAX 300000 + 50
int a, b;
int n;
pii tr[100];
double dp[MAX][20];double cal(int i, int j){return sqrt((tr[i].first - tr[j].first)*(tr[i].first - tr[j].first)+(tr[i].second - tr[j].second)*(tr[i].second - tr[j].second));
}bool judge(int p){if((p & ((1<cin >> a >> b;n = a + b;tr[0] = m_p(0, 0);for(int i = 1; i <= n; ++i){cin >> tr[i].first >> tr[i].second;}for(int i = 0; i < (1<dp[1<<(i-1)][i] = cal(0, i);}for(int i = 0; i < (1<bitset<10>b(i>>a);double v = pow(2, b.count());for(int j = 1; j <= n; ++j){if(!(1 & (i>>(j-1))))continue;for(int k = 1; k <= n; ++k){if(1 & (i>>(k-1)))continue;double p = cal(j, k) / v;dp[i|(1<<(k-1))][k] = min(dp[i|(1<<(k-1))][k], dp[i][j] + p);}}}double ans = 1e14;for(int i = 0; i < (1<if(!judge(i))continue;bitset<10>b(i>>a);double v = pow(2, b.count());for(int j = 1; j <= n; ++j){if(!(i & ((1<io;work();return 0;
}

F - Fishing

题目描述:

一维直线上有n条鱼,每条鱼的重量是ai,初始位置是xi,速度是vi

你有一个长度为k的鱼网,你可以在任意时间下网一次,问最多能抓到的鱼的重量是多大

思路:

我们枚举每条鱼作为鱼网起点,其他每条鱼最多进一次鱼网,出一次鱼网,我们计算进鱼网的时间t,记录下来,计算出鱼网的时候t,也记录下来,开一个pair的vector,把进网的时间和重量放进去,把出网的时间和负的重量放进去,然后排个序,求最大区间子段和,显然不会存在某些鱼没进网但是出网的情况,所以求的过程不会出现负数的情况,所以求最大子段和的时候不用判断和为负数的时候重制为0,还有就是用pair的时候排序第二维要插相反数,计算的时候也是计算负权值,防止由于排序引起在同一时刻有鱼进有鱼出,直接pair排序会在时间相同的情况下把负权值的鱼放前面,导致答案错误

#include 
using namespace std;#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
typedef long long ll;
typedef pair  pii;#define MAX 300000 + 50
int n;
ll k;struct ran{int w;double x, v;
}tr[MAX];
vectorv;
void fuck(int i, int j){if(tr[i].x > tr[j].x){if(tr[i].v >= tr[j].v)return;v.push_back(m_p((tr[i].x - tr[j].x) / (tr[j].v - tr[i].v), -tr[j].w));v.push_back(m_p((tr[i].x + k - tr[j].x) / (tr[j].v - tr[i].v), tr[j].w));}else if(tr[j].x >= tr[i].x && tr[j].x <= tr[i].x + k){v.push_back(m_p(0, -tr[j].w));if(tr[j].v > tr[i].v)v.push_back(m_p((tr[i].x + k - tr[j].x) / (tr[j].v - tr[i].v), tr[j].w));else if(tr[j].v < tr[i].v)v.push_back(m_p((tr[j].x - tr[i].x) / (tr[i].v - tr[j].v), tr[j].w));}else{if(tr[i].v > tr[j].v){v.push_back(m_p((tr[j].x-tr[i].x-k)/(tr[i].v-tr[j].v), -tr[j].w));v.push_back(m_p((tr[j].x-tr[i].x)/(tr[i].v-tr[j].v), +tr[j].w));}}
}void work(){cin >> n >> k;for(int i = 1; i <= n; ++i){cin >> tr[i].w >> tr[i].x >> tr[i].v;}int ans = 0;for(int i = 1; i <= n; ++i){v.clear();int sum = 0;for(int j = 1; j <= n; ++j){fuck(i, j);}sort(v.begin(), v.end());for(auto [x, y] : v){sum -= y;ans = max(ans, sum);}}cout << ans << endl;
}int main(){io;work();return 0;
}

相关内容

热门资讯

智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...
斗金订购APP贵金属期货交易骗...   斗金订购APP的投资者往往被铺天盖地的广告宣传所诱导——注册即送现金、充值返现券等看似诱人的福利...
警惕!云启购APP违规经营,披...   "5元起投、充值返现、稳赚不赔"——这些诱人的广告语背后,可能是一个精心设计的金融陷阱。  近期...
量子淘金APP贵金属投资不合规...   "4元起投""充值返券""月入过万"——这些极具诱惑力的广告语在短视频平台、社交软件上铺天盖地。...
鑫汇智投APP贵金属商品订购骗...   鑫汇智投APP非法期货投资骗局,受害者在投资过程中根本不懂交易,也不去研究和验证这个平台是否正规...