AtCoder Beginner Contest 327 A-F

2023-11-07 06:36
文章标签 atcoder beginner contest 327

本文主要是介绍AtCoder Beginner Contest 327 A-F,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • A - ab
    • B - A^A
    • C - Number Place
    • D - Good Tuple Problem
    • E - Maximize Rating
    • F - Apples

A - ab

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{int n;cin>>n;string s;cin>>s;if(s.find("ab")!=-1||s.find("ba")!=-1){cout<<"Yes"<<endl;}else cout<<"No"<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

B - A^A

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{ll n;cin>>n;for(ll i=1;i<=64;i++){ll tar=1;int f=0;for(int j=1;j<=i;j++){tar=tar*i;if(tar>n){f=1;break;}}if(f==0&&tar==n){cout<<i<<endl;return ;}}cout<<-1<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

C - Number Place

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"int a[15][15];void solve()
{for(int i=1;i<=9;i++){for(int j=1;j<=9;j++) cin>>a[i][j];}for(int i=1;i<=9;i++){vector<int> st(15);for(int j=1;j<=9;j++){st[a[i][j]]=1;}for(int j=1;j<=9;j++){if(!st[j]){//cout<<i<<endl;cout<<"No"<<endl;return ;}}}for(int i=1;i<=9;i++){vector<int> st(15);for(int j=1;j<=9;j++){st[a[j][i]]=1;}for(int j=1;j<=9;j++){if(!st[j]){//cout<<i<<endl;cout<<"No"<<endl;return;}}}for(int i=1;i<=9;i+=3){for(int j=1;j<=9;j+=3){vector<int> st(15);for(int l=i;l<i+3;l++){for(int r=j;r<j+3;r++){st[a[l][r]]=1;}}for(int k=1;k<=9;k++){if(!st[k]){//cout<<i<<" "<<j<<endl;cout<<"No"<<endl;return ;}}}}cout<<"Yes"<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

D - Good Tuple Problem

二分图判定。
题读懂第一想法是并查集,但是好像只有两个矛盾对立的部分,想到二分图。

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"vector<int> e[N];
vector<int> c(N);bool dfs(int x)
{for(auto u: e[x]){if(!c[u]){c[u]=3-c[x];if(!dfs(u)) return  false;}else{if(c[x]==c[u]) return false;}}return true;
}void solve()
{int n,m;cin>>n>>m;vector<int> a(m+5),b(m+5);for(int i=1;i<=m;i++){cin>>a[i];}for(int i=1;i<=m;i++) cin>>b[i];for(int i=1;i<=m;i++){int u=a[i],v=b[i];e[u].push_back(v);e[v].push_back(u);}for(int i=1;i<=n;i++){if(!c[i]){c[i]=1;if(!dfs(i)){//cout<<i<<endl;cout<<"No"<<endl;return ;}}}cout<<"Yes"<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

E - Maximize Rating

看了眼数据范围,一眼dp,但是题读错了,以为可以随意选。
言归正传,因为必须要按照给定的顺序继续选,再加上数据范围,很容易想到dp,考虑状态设计,对于每一个 k ,当其大小确定时,
R = ∑ i = 1 k ( 0.9 ) k − i Q i ∑ i = 1 k ( 0.9 ) k − i − 1200 k . \displaystyle R=\frac{\sum_{i=1}^k (0.9)^{k-i}Q_i}{\sum_{i=1}^k (0.9)^{k-i}}-\frac{1200}{\sqrt{k}}. R=i=1k(0.9)kii=1k(0.9)kiQik 1200.
我们可以发现对于式子,只有
∑ i = 1 k ( 0.9 ) k − i Q i \sum_{i=1}^k (0.9)^{k-i}Q_i i=1k(0.9)kiQi
该式子的值不为定值,所以考虑求出该式子的最值,现在即转化为了,我们在前 i 个数字中选出 j 个,让该式子的值最大,对于此说法很容易联想到背包,于是跑个背包然后枚举k即可。
具体看注释

#include <bits/stdc++.h>using namespace std;
const int N = 2e7 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"double dp[N];void solve()
{int n;cin>>n;vector<int> a(n+5);for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++) dp[i]=-1e9;//dp初始化,因为可能出现负数,所以要初始化为-1e9for(int i=1;i<=n;i++){//01背包for(int j=i;j>=1;j--){dp[j]=max(dp[j],dp[j-1]*0.9+a[i]);}}double ans=-0x3f3f3f3f;double dx=1;for(int i=1;i<=n;i++){//用01背包去更新答案,即枚举kans=max(ans,dp[i]/dx-1200/sqrt(i));dx=dx*0.9+1;}printf("%.10lf",ans);}int main()
{// ios::sync_with_stdio(0);// cin.tie(0);// cout.tie(0);int t;t=1;//cin>>t;while(t--){solve();}system("pause");return 0;
}

F - Apples

经典扫描线+二维偏序。
对于这种问题,对其中一维进行排序,然后使用数据结构去维护另一维。
对于此题,我们可以将时间看作一维,坐标看作另一维,该题就成了给定一个指定大小的矩形,问该矩形中最多存在多少点。
对于点 ( x , y ) (x,y) (x,y),我们令其为左下端点,很容易知道其右上端点为 ( x + w , y + d ) (x+w,y+d) (x+w,y+d),考虑这个点什么时候会产生贡献,若对其纵坐标进行排序,,我们可以想象此时有一条线从 y=0 ,开始向上进行扫描,则其在区间 [ y , y + d ) [y,y+d) [y,y+d)会产生贡献,而其对应产生贡献的区间为 [ x , x + w − 1 ] [x,x+w-1] [x,x+w1],所以很容易使用线段树去进行维护,对于在位置 y 的线段,其贡献为 1 ,对于位置在 y+d 的线段,其贡献为 -1,所以使用线段树进行区间修改和最大值查询即可。

#include <bits/stdc++.h>using namespace std;
const int N = 4e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 1e9+7;
const int maxv = 4e6 + 5;
// #define endl "\n"int n,d,w,cnt;struct node
{int l,r,w,v;
}b[N];struct seg
{ll l,r,sum,add;#define l(x) tr[x].l#define r(x) tr[x].r#define sum(x) tr[x].sum#define add(x) tr[x].add
}tr[N*4];void update(int p)
{sum(p)=max(sum(p*2),sum(p*2+1));
}void build(int p,int l,int r)
{if(l==r){tr[p]={l,r,0,0};return ;}l(p)=l,r(p)=r;int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);update(p);
}void pushdown(int p)
{if(add(p)){sum(p*2)+=add(p);sum(p*2+1)+=add(p);add(p*2)+=add(p);add(p*2+1)+=add(p);add(p)=0;}
}void modify(int p,int l,int r,int tag)
{if(l<=l(p)&&r(p)<=r){add(p)+=tag;sum(p)+=tag;return ;}pushdown(p);int mid=(l(p)+r(p))/2;if(l<=mid) modify(p*2,l,r,tag);if(r>mid) modify(p*2+1,l,r,tag);update(p);}int query(int p,int l,int r)
{if(l<=l(p)&&r(p)<=r){//cout<<l<<" "<<r<<" "<<sum(p)<<endl;return sum(p);}pushdown(p);int mid=(l(p)+r(p))/2;int res=0;if(l<=mid) res=query(p*2,l,r);if(r>mid) res=max(res,query(p*2+1,l,r));return res;
}void solve()
{cin>>n>>d>>w;int len=0;for(int i=1;i<=n;i++){int c,l;cin>>c>>l;b[i].l=b[i+n].l=l;b[i].r=b[i+n].r=l+w-1;b[i].w=1;b[i].v=c;b[i+n].w=-1;b[i+n].v=c+d;len=max(len,l+w-1);}sort(b+1,b+n*2+1,[](node x,node y){if(x.v==y.v) return x.w<y.w;return x.v<y.v;});build(1,1,len);int ans=0;for(int i=1;i<=2*n;i++){auto [l,r,w,v]=b[i];modify(1,l,r,w);ans=max(ans,query(1,1,len));}cout<<ans<<endl;}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;//cin>>t;while(t--){solve();}system("pause");return 0;
}

这篇关于AtCoder Beginner Contest 327 A-F的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

AtCoder Beginner Contest 369 D - Bonus EXP 动态规划

原题链接: https://atcoder.jp/contests/abc369/tasks/abc369_d 思路:   这道题为什么要用动态规划呢,其实,对于第i个怪物,我们有打与不打两种处理方式,而对于打,我们是获得两倍的经验值,还是一倍的经验值,与我们打了奇数只怪物还是打了偶数只怪物有关了,因此我们定义dp[i][0] 为前i只怪物总共打了偶数次,dp[i][1] 为前i只怪物总

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算

【UVa】10600 ACM Contest and Blackout 次小生成树

类型:次小生成树 题目大意: 为了举办ACM竞赛,市长决定给所有的n(3 <= n <= 100)所学校提供可靠的电力供应。当且仅当一个学校直接连到电站,或者连到另一个有可靠供应的学校时,才有可靠供应。现在给出在不同学校之间的布线成本,找出最便宜的两种连线方案。一个方案的成本等于其中所有学校之间连线的成本的总和。 题目分析: 次小生成树。 先求出最小生成树,然后枚举所有不在

【POJ】3660 Cow Contest floyd(可以拓扑排序?)

Cow Contest Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6925 Accepted: 3792 Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating i