2020.03.14 Preliminaries for BAPC 2019 解题报告

目录

  • B

    • 题意
    • 思路
    • 代码
  • D
    • 题意
    • 思路
    • 代码
  • E
    • 题意
    • 思路
    • 代码
  • I
    • 题意
    • 思路
    • 代码

B

题意

就是让你通过给你的规律,来把一行公式进行求值

思路

通过看题面上的规律, 我们可以知道第一行是+,第二行是*,第三行是+and so on ...,所以我们只要把对应位置的数字用对应的符号进行运算就行

代码

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<sstream>
using namespace std;

#define sf scanf
#define pf printf
#define pfn printf("\n");
#define pfk printf(" ");
#define pf0 printf("0");
#define pf1 printf("1");
#define ll long long
//#define ll __int128
#define ull unsigned long long
#define sfd(n) scanf("%d",&n);
#define sfdd(n,m) scanf("%d%d",&n,&m);
#define sfld(n) scanf("%lld",&n);
#define sfldd(n,m) scanf("%lld%lld",&n,&m);
#define sflf(n) scanf("%lf",&n);
#define sflff(n,m) scanf("%lf%lf",&n,&m);
#define sfc(n) scanf("%c",n);
#define sfcc(n,m) scanf("%c%c",n,m);
#define sfs(n) scanf("%s",n);
#define sfss(n,m) scanf("%s%s",n,m);
#define pfd(n) printf("%d",n);
#define pfld(n) printf("%lld",n);
#define pflf(n) printf("%lf",n);
#define pfc(n) printf("%c",n);
#define pfs(n) printf("%s",n);

#define csh(a,n) memset(a,n,sizeof(a));
vector<ll>brr[300010],crr;
ll mod=1000000007;
int main()
{
    int n;
    cin>>n;
    int p=0;
    while(n--){
        char a[100];
        cin>>a;
        if(a[0]=='('){
            p++;
        }
        else if(a[0]==')'){
            ll b=0;
            if(p%2==0){
                for(int i=0;i<brr[p].size();i++){
                    b+=brr[p][i];
                    b%=mod;
                }
                brr[p].clear();
            }
            else{
                b=1;
                for(int i=0;i<brr[p].size();i++){
                    b*=brr[p][i];
                    b%=mod;
                }
                brr[p].clear();
            }
            p--;
            brr[p].push_back(b);
        }
        else{
            ll b=0;
            for(int i=0;i<strlen(a);i++){
                b*=10;
                b+=a[i]-'0';
            }
            b%=mod;
            brr[p].push_back(b);
        }
    }
    ll b=0;
    for(int i=0;i<brr[0].size();i++){
        b+=brr[0][i];
        b%=mod;
    }
    cout<<b<<endl;
    return 0;
}

D

题意

问你一个(n面的)骰子投出K次后,最大的期望是多少

思路

首先我们通过题面知道每次投骰子都有两种情况

  • 让骰子停止转动(就是不投)
  • 重新转动骰子

所以我们只要考虑一件事情就行,就是当前的点数与上次的点数的大小 (设一开始期望是E1:$\frac{1+2+...+n}{n} $)
- 如果当前的小于的话,那我们就不需要本次的点数即停止骰子转动 -> $\frac{E1*E1}{n} $
- 反之,则取当前的点数 -> $\frac{E1+1+E1+2+...+n}{n} $
最后整理一下就可以了

代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
    double n,ans=0,t=0;
    int k;
    cin>>n>>k;
    while(k--)
    {
        ans=(ans*t+n*(n+1)/2-t*(t+1)/2)/n;
        t=floor(ans);
    }
    printf("%.9f\n",ans);
    return 0;
}

E

题意

问你是否可以使图没有回环

思路

因为题面说了,最多删除n/2个边所以只要判断

  • 从小到大的边和从大到小的边 的数量即可
  • 输出多的(这样删去后保证了没有回环存在)

代码



#include <vector>
#include <algorithm>
#include <string>
#include<cstring>
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <unordered_map>
#include <bitset>
#include <cassert>
#include <chrono>
#include <random>
#include <iomanip>
#include <unordered_set>
#include <ctime>
#include <chrono>
using namespace std;
// #define  ll long long
const int N =1e5+10;

#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define pb push_back
#define sz(x) (int)(x).size()
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
ll n , m ,t ;
int f[1000010],br[2000010];
int s[2000010]={0};
bool st[N];

ll mod = 1e9+7;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >>n>>m;
    vector<int > s1, s2;
    for(int i=0;i<m;i++)    {
        int a, b;cin >>a>>b;
        if(a<b)s1.pb(i+1);
        else s2.pb(i+1);
    }
    if(sz(s1)> sz(s2)){
        cout<<sz(s2)<<endl;
        for(auto it:s2)cout<<it<<" ";
        cout<<endl;
    }
    else {
        cout<<sz(s1)<<endl;
        for(auto it:s1)cout<<it<<" ";
        cout<<endl;

    }
    return 0;

}
/*
 * 5
4 100
0 0 0 0
1 2
1
3 4
1 4 1
3 2
0 1 3
3 9
0 59049 810
*/

I

题意

很直接,问你\[ n = m^{2}-k^{2} \],是否存在

  • 存在输出n和m
  • 不存在输出0

思路

暴力

  • 因为 \[n = m^{2}-k^{2} \longleftrightarrow n =(m-k)*(m+k) \] ,即(m-k) 和(m+k)是n的因数,所以先求出n的所有因数
  • 然后双重for寻找满足的m,k

代码



#include <vector>
#include <algorithm>
#include <string>
#include<cstring>
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <unordered_map>
#include <bitset>
#include <cassert>
#include <chrono>
#include <random>
#include <iomanip>
#include <unordered_set>
#include <ctime>
#include <chrono>
using namespace std;
// #define  ll long long
const int N =1e5+10;

#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define pb push_back
#define sz(x) (int)(x).size()
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
int n , m ,t ;
int ar[1000010],br[200010];
int f[2010][2010]={0};
bool st[N];
ll mod = 1e9+7;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >>n;
    ll num  =0 ,cnt =0 ;
    for(int i=1;i<=n;i++){
        cin >>ar[i];
        if(i>=2)cnt+=ar[i];
        else num=ar[i]*ar[i] +num ;
     }
     //cout<<num<<" "<<cnt<<endl;
     ll sum =num*cnt ;
     for(int i=2;i<=n;i++){
            num=ar[i]*ar[i] +num;
            cnt -= ar[i];
        //  cout<<num<<" "<<cnt<<endl;
            sum = max(sum , num*cnt);
//          sum = num*cnt;

     }
     cout <<sum<<endl;
//cout<<sum<<endl;

    return 0;

}
/*
 * 5
4 100
0 0 0 0
1 2
1
3 4
1 4 1
3 2
0 1 3
3 9
0 59049 810
*/

原文地址:https://www.cnblogs.com/gaohaoy/p/12507596.html

时间: 2024-10-09 18:04:41

2020.03.14 Preliminaries for BAPC 2019 解题报告的相关文章

2020-3-14 acm训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019 解题报告+补题报告

2020-3-15比赛解题报告+2020-3-8—2020-3-15的补题报告 2020-3-15比赛题解 训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019  A建筑(模拟) 耗时:3ms 244KB 建筑 你哥哥在最近的建筑问题突破大会上获得了一个奖项 并获得了千载难逢的重新设计城市中心的机会 他最喜欢的城市奈梅根.由于城市布局中最引人注目的部分是天际线, 你的兄弟已经开始为他想要北方和东方的天际线画一些想法

2020/3/14 Preliminaries for Benelux Algorithm Programming Contest 2019 部分补题报告和解题报告

A. Architecture 比较行列最大值相同则possible 不同则impossible #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; int main(){ int r,c,x,y,i; int maxx=0,maxy=0; cin>>r>>c; for(i=1;i<=r;i++)

2020.3.21 Benelux Algorithm Programming Contest 2019 解题报告

B-Breaking Branches 大意就是两个人掰树枝子玩,是个典型的博弈题,判断能不能被2整除就可以了 #include<cstdio> using namespace std; int main(){ long long int n,m,t; scanf("%lld",&n); if(n%2==0){ printf("Alice\n"); printf("1\n"); }else{ printf("Bob\

2015 暑假集训14级第一周周赛解题报告

A.小模拟题 根据要求模拟即可.没什么可讲的.. 参考代码:http://paste.ubuntu.com/11978075/ B.组合计数 首先排序,然后可以在O(n)复杂度内求出每个hero所能拿的sword的最大范围. 然后可以从第一个开始拿,考虑对于当前第i个hero来说,假设第i个hero最多能拿到第j个sword,那么首先这j个中一定有i-1个已经被前i-1个拿到了,所以第i个只能从后面的剩下的j-i个中选,于是可以拿j-i个.然后用高中学到的组合数学的知识,将每一个的可选个数乘起来

2019模拟赛09场解题报告

目录 2019模拟赛09场解题报告 目录la~~ 题一:瞬间移动 题二:食物订购 题三:马蹄印 题四:景观美化 2019模拟赛09场解题报告 标签(空格分隔): 解题报告 Forever_chen 2019.8.20 目录la~~ 题一:瞬间移动 [题面] 有一天,暮光闪闪突然对如何将一个整数序列a1,a2,...,an排序为一个不下降序列起了兴趣.身为一只年轻独角兽的她,只能进行一种叫做"单元转换"(unit shift)的操作.换句话说,她可以将序列的最后一个元素移动到它的起始位置

解题报告 smoj 2019初二创新班(2019.3.17)

目录 解题报告 smoj 2019初二创新班(2019.3.17) T1:找玩具 题目描述 题意转化 分析 代码 优化(代码复杂度) T2:闯关游戏 题目描述 分析 代码 T3:子数组有主元素 题目描述 分析 代码(\(O(nm\log n)\)) 优化 代码(\(O(nm)\)) 解题报告 smoj 2019初二创新班(2019.3.17) 时间:2019.3.21 T1:找玩具 题目描述 在游戏开始之前,游戏大师在房间的某些地方隐藏了N个玩具.玩具编号为1到N.您的任务是尽可能多地找到这些玩

解题报告-2019.12.16

解题报告-2019.12 题目:6-3[拓展编程题_课后练习3][P215 习题8-三-4] 报数 (20分) 题目详情: 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号.从第一个人开始报数,报到m(<n)的人退出圈子:下一个人从1开始报数,报到m的人退出圈子.如此下去,直到留下最后一个人. 本题要求编写函数,给出每个人的退出顺序编号. 函数接口定义:void CountOff( int n, int m, int out[] ); 其中n是初始人数:m是游戏规定的退出位次(保证为小于

《编程之美》解题报告:2.14 求数组的子数组之和的最大值

引言 ? ? 本文用了五种方法来求解这道题,从最初的n^3的复杂度到后面的n的复杂度,分别用到了递推公式.分而治之以及动态规划的方法去一步步降低算法的复杂度. ? ? 解题报告 ? ? 首先我们很容易想到的一个解法就是三层遍历,首先子数组必定是连续的一串值,相当于从原数组array的下标范围0~n-1中选出i和j,去算arra[i]~array[j]的和,于是我们可以得到最初的第一个解法 ? ? public static int sol1(int[] array) { int lenght =

CH Round #56 - 国庆节欢乐赛解题报告

最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树,其中一些树上结有能够产生能量的魔力水果.已知每个水果的位置(Xi,Yi)以及它能提供的能量Ci.然而,魔幻森林在某些时候会发生变化:(1) 有两行树交换了位置.(2) 有两列树交换了位置.当然,树上结有的水果也跟随着树一起移动.不过,只有当两行(列)包含的魔力水果数都大于0,或者两行(列)都没有魔