首页 > 其他分享 >2020 ICPC 南京 EFKL

2020 ICPC 南京 EFKL

时间:2023-10-04 12:55:59浏览次数:48  
标签:const int nullptr cin long ICPC 2020 EFKL tie

2020-2021 ACM-ICPC, Asia Nanjing Regional Contest (XXI Open Cup, Grand Prix of Nanjing)

E. Evil Coordinate

思路:因为如果给定了起点和初始走法,其实我们的终点是一定确定的。我们不妨让上下左右的连着一块走,那么对于\(RLUD\)一共有\(4!\)种走法(全排列),我们暴力枚举然后\(check\)就可以了。

为什么这样是对的?为什么一条路走到底就可以把所以情况考虑完全了?

其实答案走法有很多种,但是我们可以把答案的走法拼接成连续的走法,这样就可以实现了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
#define int long long
int a[25][5];
int cnt[5];
int tmp[5];
bool vis[5];
int cn = 0;
void dfs(int step)
{
    if(step>4)
    {
        cn++;
        for(int i = 1;i<=4;i++)
            a[cn][i] = tmp[i];
        return;
    }

    for(int i = 1;i<=4;i++)
    {
        if(!vis[i])
        {
            vis[i] = true;
            tmp[step] = i;
            dfs(step+1);
            tmp[step] = 0;
            vis[i] = false;
        }
    }
}

void init()
{
    dfs(1);
}

signed main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
  
    int t;
    cin>>t;
    init();
    while(t--)
    {
        int mx,my;
        cin>>mx>>my;
        string s;
        cin>>s;
        int sz = s.size();
        s = "?"+s;
        memset(cnt,0,sizeof(cnt));
        for(int i = 1;i <= sz;i++)
        {
            if(s[i]=='R')cnt[1]++;
            else if(s[i]=='L')cnt[2]++;
            else if(s[i]=='U')cnt[3]++;
            else if(s[i]=='D')cnt[4]++;
        }

        //R1,L2,U3,D4
        bool flag = false;
        for(int i = 1;i<=24;i++)
        {
            bool ok = true;
            int lastx = 0,lasty = 0;
            int x = 0,y = 0;

            for(int j = 1;j<=4;j++)
            {
                //cout<<"i = "<<i<<"\n";
               // cout<<"a[i][j] = "<<a[i][j]<<"\n";
                if(a[i][j]==1&&cnt[1]){
                    x+=cnt[1];
                   // cout<<" x = "<<x<<" lastx = "<<lastx<<"\n";
                    if(y==my)
                    {
                        if((lastx<=mx&&mx<=x)||(x<=mx&&mx<=lastx)){
                            ok = false;
                        }else lastx = x;
                    }
                    else lastx = x;
                }
                else if(a[i][j]==2&&cnt[2]){
                    x-=cnt[2];
                    if(y==my)
                    {
                        if((lastx<=mx&&mx<=x)||(x<=mx&&mx<=lastx)){
                            ok = false;
                        }else lastx = x;
                    }
                    else lastx = x;
                }
                else if(a[i][j]==3&&cnt[3]){
                    y += cnt[3];
                    if(x==mx)
                    {
                        if((lasty<=my&&my<=y)||(y<=my&&my<=lasty)){
                            ok = false;
                        }
                        else lasty = y;
                    }else lasty = y;
                }
                else if(a[i][j]==4&&cnt[4]){
                    y -= cnt[4];
                    if(x==mx)
                    {
                        if((lasty<=my&&my<=y)||(y<=my&&my<=lasty)){
                            ok = false;
                        }
                        else lasty = y;
                    }else lasty = y;
                }

            }
            if(ok)
            {
                for(int j = 1;j<=4;j++)
                {
                    for(int k = 1;k<=cnt[a[i][j]];k++)
                    {
                        if(a[i][j]==1)
                            cout<<"R";
                        else if(a[i][j]==2)
                            cout<<"L";
                        else if(a[i][j]==3)
                            cout<<"U";
                        else cout<<"D";
                    }
                }
                cout<<"\n";
                flag = true;
                break;
            }
        }
        if(!flag)
            cout<<"Impossible\n";
    }

    return 0;
}

F.Fireworks

思路:一开始我们想成了求平均期望,思路上有问题的,因为题目求的是最优的。是求最小期望花费。

我们要做\(x\)次点亮一次,那么这\(x\)次中至少有一个是完美的概率就是\((1-全部都不完美的概率)\),那全部都不完美的概率就是\(q^x\)次方,即至少有一个是完美的概率是\(1-q^k\)。

期望制作轮数\(E(x)=\dfrac{1}{1-q^k}\),期望时间:\(f(k) = (n\times k+m)\times E(x)\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const double eps = 1e-6;
double n,m,p,q;

double f(double x)
{
    return (x*n+m)/(1.0-pow(q,x));
}
/*
3
1 1 5000
1 1 1
1 2 10000
*/

int main()
{
   // ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t;
    cin>>t;
    while(t--)
    {
        
        cin>>n>>m>>p;
        p = 1.0*p/10000.0;
        q = 1.0-p;
        //cout<<"p = "<<p<<" q = "<<q<<endl;
        ll l = 1,r = 1e9;
        while(r-l>2)
        {
            int mid1 = l+(r-l)/3;
            int mid2 = r-(r-l)/3;
            if(f(mid1)<=f(mid2))r = mid2;
            else l = mid1;
        }
        double ans = 1e18;
        for(int i = l;i <= r;i++)
            ans = min(ans,f(i));
        printf("%.10lf\n",ans);
    }
    return 0;
}

K. K Co-prime Permutation

思路:因为每一个数一定和下一个数互质,注意\(1\)和所有数都互质。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int n,k;
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    cin>>n>>k;
    if(k==0)cout<<-1<<"\n";
    else{
        for(int i = 1;i<=k-1;i++)
            cout<<i+1<<" ";
        cout<<1<<" ";    
        for(int i = k+1;i<=n;i++)
            cout<<i<<" ";
    }
    return 0;
}

L. Let's Play Curling

思路:求连续的红色的最大数量。注意可能有重叠。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
  
    int t;
    cin>>t;
    while(t--)
    {
        set<int>a,b;
        map<int,int>cnt;
        int n,m;
        cin>>n>>m;
        for(int i = 1;i <= n; i++){
            int x;
            cin>>x;
            a.insert(x);
            cnt[x]++;
        }
        for(int i = 1;i <= m; i++){
            int x;
            cin>>x;
            b.insert(x);
        }
        vector<int> v;
        for(auto x:a)
            v.push_back(x);
        for(auto x:b)
            v.push_back(x);
        sort(v.begin(), v.end());
        int tmp = 0,ans = 0;
        int k = v.size();
        for(int i = 0;i<k;i++)
        {
            if(a.find(v[i])!=a.end()&&b.find(v[i])==b.end())
                tmp += cnt[v[i]];
            else ans = max(ans,tmp),tmp = 0;
        }
        ans = max(ans,tmp);
        if(ans==0)cout<<"Impossible\n";
        else
            cout<<ans<<"\n";
    }

    return 0;
}

标签:const,int,nullptr,cin,long,ICPC,2020,EFKL,tie
From: https://www.cnblogs.com/nannandbk/p/17742150.html

相关文章

  • The 2022 ICPC 南京 ADG
    The2022ICPCAsiaNanjingRegionalContestA.Stop,YesterdayPleaseNoMore思路:因为袋鼠是同时移动的,所以我们可以不考虑袋鼠怎么动,而去考虑边界怎么动。所以我们先不考虑洞的影响,先确定哪些会因为边界而离开。确定好最终边界,再进行一次模拟,加入有洞的情况,发现洞产生的路径......
  • 2023 ICPC 香港
    gym开场发现E是传统数据结构题很高兴,不过先跳了。F知道相邻两段的长度差\(\le1\),以为最终每段长度只有\(\lfloor\frac{n}{m+1}\rfloor,\lceil\frac{n}{m+1}\rceil\)两种,那就可以DP了,队友签完HA我上去写,呼救两次后WAontest2,gjk说不相邻的两端长度差不一定\(\le1......
  • [ACTF2020 新生赛]Exec 1
    原理linux系统命令的使用命令执行漏洞解题过程打开靶场发现有ping功能,猜测是涉及命令执行漏洞,根据题目的Exec也能看出回来,先试试ping127.0.0.1,没问题接着使用&连接符执行多条系统命令,执行了ls命令,发现只有index.php,猜测flag是在根目录那里,所以我们就是用ls/来找出flagpa......
  • BUUOJ[ACTF2020 新生赛]Include 1
    原理文件包含伪协议的利用解题过程靶场进入发现一个超链接,点了一下发现跳转到了flag.php文件传递了参数file=flag.php。猜测应该是文件包含。文件包含读取文件源码要想到伪协议了。--要多补补了payload:?file=php://filter/read=convert.base64-encode/resource=flag.php......
  • P7073 [CSP-J2020] 表达式
    Problem考察算法:后缀表达式建树,优化。题目简述读入一个后缀表达式,由\(\&,\mid,!\)三种运算和操作数构成。有\(q\)次询问,每次输入一个下标\(i\),表示要取反\(x_i\)的值。每次求表达式的值。暴力每次重新建表达式树,计算。时间复杂度:\(O(q\times|s|)\),达到了惊人的\(10......
  • P7072 [CSP-J2020] 直播获奖
    Problem考查知识点:桶优化。题目简述竞赛的获奖率为\(w\%\),即当前排名前\(w\%\)的选手的最低成绩就是即时的分数线。若当前已评出了\(p\)个选手的成绩,则当前计划获奖人数为\(\max(1,\lfloorp\timesw\%\rfloor)\),如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实......
  • P7074 [CSP-J2020] 方格取数
    Problem相关算法:\(DP\)。题意简述给你一个方格图,每次只能向上、向右、向下走。现在求:经过所有点取到的数字和的最大值。思路动态规划。对于每一列而言,如果某个点向上走了,就不可能再向下走。向下走了同理。所以我们可以把两种情况都尝试一遍,每个点而言,如果是处于向下的状态......
  • 2023ICPC网络赛第二场
    2023ICPC网络赛第二场MDirtyWork解题思路:算出解决每道题的时间的期望,升序排序,前缀和累加即可。时间复杂度:\(O(nlogn)\)代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;typedefpair<int,int>pii;#definefi#defineseintn;voidsolv......
  • 我的新老师(原作于2020 - 9,转载)
        小学升入初中,接触到的一切事物都是新的,所有老师也都是新面孔,而其中有一位非常有意思的老师,便是我们的班主任虞老师。    虞老师不高不矮,却胖胖的,脸还圆圆的,头发稍有点卷。虞老师的脸就像是上帝亲手用圆规画出来的,总是让你觉得圆得一点瑕疵也没有,再配上五官,简......
  • The 2022 ICPC Asia Shenyang Regional Contest
    C.ClampedSequence因为\(n\)的范围不大,并且可以猜到\(l,r\)中应该至少有一个在\(a_i,a_i-1,a_i+1\)上。所以直接暴力枚举\(l\)或\(r\)然后暴力的计算一下#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;int32_tmain(){......