AtCoder Beginner Contest 353(A~E)

2024-05-13 15:44
文章标签 atcoder beginner contest 353

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

文章目录

  • A Buildings
    • 1.基本思路:
    • 2.代码:
  • B - AtCoder Amusement Park
    • 1.基本思路:
    • 2.代码:
  • C - Sigma Problem
    • 1.基本思路:
    • 2.代码:
  • D - Another Sigma Problem
    • 1.基本思路:
    • 2.代码:
  • E - Yet Another Sigma Problem
    • 1.基本思路:
    • 2.代码:


A Buildings

1.基本思路:

  • 模拟

2.代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int n;void solve(){cin>>n;int pre;for(int i=1;i<=n;i++){int x; cin>>x;if(i==1) pre=x;else if(x>pre){cout<<i;return;}}cout<<-1;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

B - AtCoder Amusement Park

1.基本思路:

  • 模拟,理解题意就ok了

2.代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int n,k,a[N];
int cnt=1;void solve(){cin>>n>>k;int now=0;for(int i=1;i<=n;i++){cin>>a[i];if(a[i]+now<=k) now+=a[i];else{now=a[i];++cnt;}}cout<<cnt;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

C - Sigma Problem

1.基本思路:

  • 思维
  • 发现规律,两数之和小于1e8直接相加即可,两数之和大于1e8需要减去一个1e8,再累加到答案
  • 我们发现数组的顺序不影响答案,排序一下
  • 然后二分找到第一个与当前第i个数相加大于1e8的位置,该位置之前的数与当前数字相加均小于1e8,这里前缀和与处理一下。
  • 该位置及之后的位置,相加均大于1e8,需要减去(i-pos)个1e8。

2.代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 3e5+10, INF = 0x3f3f3f3f;
const int mod = 1e8;
int n,a[N],sum[N];
int ans=0;void solve(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n); 
//	for(int i=1;i<=n;i++) cout<<a[i]<<' ';cout<<endl;for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];for(int i=2;i<=n;i++){int x=mod-a[i];int pos=lower_bound(a+1,a+1+i,x)-a;if(pos>i) pos--;
//		cout<<x<<' '<<pos<<endl;ans+=sum[pos-1]+(i-1)*a[i];ans+=sum[i-1]-sum[pos-1]-(i-pos)*mod;}cout<<ans;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

D - Another Sigma Problem

1.基本思路:

  • 思维题
  • 第i个数需要加上(i-1)次,因为受前面数的影响
  • 而当数与后面的数字连接显然跟后面数字的位数有关
  • 所以累加当前数字乘以10的位数次方,位数是后面每个数字的位数

2.代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 2e5+10, INF = 0x3f3f3f3f;
const int mod = 998244353;
int n,a[N],ans;
int dp[N][12]; //dp[i][j]表示第i个数之前(包含i)长度为j的数的个数 
int cnt[N]; int qpow(int a,int b){int res=1;while(b){if(b&1) res=res*a%mod;a=a*a%mod;b>>=1;}return res;
}void solve(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];int k=a[i],len=0;while(k){len++;k/=10;}cnt[len]++;dp[i][len]++;}for(int i=1;i<=n;i++){for(int j=1;j<=10;j++){dp[i][j]+=dp[i-1][j];}}
//	for(int i=1;i<=n;i++) cout<<cnt[i]<<' '; cout<<endl;for(int i=1;i<=n;i++){ans=(ans+a[i]*(i-1)%mod)%mod;for(int j=1;j<=10;j++){ //长度为j int num=cnt[j]-dp[i][j]; //i之后长度为j的数的个数 
//			cout<<"***"<<cnt[j]<<' '<<dp[i][j]<<' '<<num<<endl;ans=(ans+a[i]%mod*qpow(10,j)%mod*num%mod)%mod;}} cout<<ans;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

E - Yet Another Sigma Problem

1.基本思路:

  • 字典树Trie的模板题
  • 字典树每个字母出现的次数对答案的贡献是C(n,2)

2.代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N =3e5+10, INF = 0x3f3f3f3f;
const int mod = 998244353;
int n,ans;
int ch[N][26],idx; 
map<int,int> mp;void insert(string s){int p=0;for(int i=0;i<s.size();i++){int j=s[i]-'a';if(!ch[p][j]) ch[p][j]=++idx;mp[ch[p][j]]++;p=ch[p][j];}
}void solve(){cin>>n;for(int i=1;i<=n;i++){string s; cin>>s;insert(s);}for(auto i:mp) ans+=i.se*(i.se-1)/2;cout<<ans;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

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



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

相关文章

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:   过计算

数据结构 - Codeforces Round #353 (Div. 2) D. Tree Construction

Tree Construction  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定n个数,按照构造Binary Search Tree的方式来构造BST树,按顺序输出每一个非root结点的父节点的值。 analyse

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

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