AtCoder Beginner Contest 407 A-F
A - Approximation
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
double a,b;
cin>>a>>b;
double c=a/b;
int d=c;
int e=c+1;
if(c-d>e-c){
cout<<e<<endl;
}
else cout<<d<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
B - P(X or Y)
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
set<pii> s1,s2;
int a,b,cnt=0;
cin>>a>>b;
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(i+j>=a || abs(i-j)>=b) cnt++;
}
}
double ans = (double)cnt/36;
printf("%.11f",ans);
// cout<<cnt;
}
signed main(){
// ios::sync_with_stdio(0);
// cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
C - Security 2
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
string s;
cin>>s;
int n=s.size();
vector<int> a(n);
for(int i=0;i<n;i++){
a[i]=s[i]-'0';
}
int ans=n;
int cnt=0;
for(int i=n-1;i>=0;i--){
a[i]-=cnt;
a[i]%=10;
a[i]=(a[i]+10)%10;
ans+=a[i];
cnt+=a[i];
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
D - Domino Covering XOR
数据范围很小,直接dfs就行,dfs中有很多细节要注意
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
int dx[]={1,0};
int dy[]={0,1};
void solve(){
int n,m;
cin>>n>>m;
vector<vector<int>> g(n+10,vector<int>(m+10));
vector<vector<int>> st(n+10,vector<int>(m+10));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
int ans=0;
auto dfs = [&](auto dfs,int x,int y)->void {
int tmp=0;
//检查当前方案
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!st[i][j]) tmp^=g[i][j];
}
}
ans=max(ans,tmp);
for(int i=x;i<=n;i++){
for(int j = (i == x ? y : 1);j<=m;j++){
if(!st[i][j]){
st[i][j]=1;
for(int k=0;k<2;k++){
int a=i+dx[k];
int b=j+dy[k];
if(a>=1 && a<=n && b>=1 && b<=m && !st[a][b]){
st[a][b]=1;
if(j<m) dfs(dfs,i,j+1);
else dfs(dfs,i+1,1);
st[a][b]=0;
}
}
st[i][j]=0;
}
}
}
};
dfs(dfs,1,1);
cout<<ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}
E - Most Valuable Parentheses
经典括号序列题目
括号序列的一种定义是同时满足以下 2 个条件:
- 对于所有 1≤ i ≤ 2N ,在 S1,…,Si 中至少有一半( i/2 上取整 )是
(。 - 整个序列 S1 , … , S2N 中恰好有 N 个
(。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n,ans=0;
cin>>n;
priority_queue<int> q;
for(int i=1;i<=2*n;i++){
int val;
cin>>val;
q.push(val);
if(i&1){
ans+=q.top();
q.pop();
}
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
cin>>ct;
while(ct--){
solve();
}
return 0;
}
F - Sums of Sliding Window Maximum
对每个a[i],找到左右边界l,r,满足只要选中的区间严格在区间(l,r)内(或者说在区间[l+1,r-1]中),则a[i]就是这个区间的答案
使用单调栈可以找到每个i的l,r
注意因为会存在重复元素,所以为了保证区间内的重复元素只会对答案产生一次贡献,在找l,r时,让a[l]>a[i], a[r]>=a[i]即可
y=min(i-l[i],r[i]-i), x=max(i-l[i],r[i]-i)
到这一步,会发现a[i]对答案的贡献是一个梯形,从k=1到k=y上升,y-x不变,从x开始下降
用二阶差分可以维护
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using pii=pair<int,int>;
using ll = long long;
using ull = unsigned long long;
//using i128 = __int128_t;
const ll inf = 1e18;
const int mod = 998244353;
void solve(){
int n;
cin>>n;
vector<int> a(n+10),l(n+10),r(n+10,n+1),ans(n+10);
for(int i=1;i<=n;i++){
cin>>a[i];
}
stack<int> stk;
for(int i=1;i<=n;i++){
while(stk.size() && a[stk.top()]<=a[i]){
stk.pop();
}
if(stk.size()) l[i]=stk.top();
stk.push(i);
}
while(stk.size()) stk.pop();
for(int i=n;i>=1;i--){
while(stk.size() && a[stk.top()]<a[i]){
stk.pop();
}
if(stk.size()) r[i]=stk.top();
stk.push(i);
}
for(int i=1;i<=n;i++){
// cout<<l[i]<<" "<<r[i]<<endl;
int x=max(i-l[i],r[i]-i);
int y=min(i-l[i],r[i]-i);
ans[1]+=a[i];
ans[y+1]-=a[i];
ans[x+1]-=a[i];
ans[x+y+1]+=a[i];
}
for(int i=1;i<=n;i++){
ans[i]+=ans[i-1];
}
for(int i=1;i<=n;i++){
ans[i]+=ans[i-1];
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<endl;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int ct=1;
// cin>>ct;
while(ct--){
solve();
}
return 0;
}

浙公网安备 33010602011771号