Helvetic Coding Contest 2018 online mirror (teams allowed, unrated) easy难度

原创 2018年04月17日 19:37:17

点击打开链接

A1:思维题

#include <bits/stdc++.h>
using namespace std;
char s[15][15],s1[15][15];
int main()
{
    int n,cnt1=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
     {
         scanf("%s",&s[i]);
         for(int j=0;j<n;j++)
            if(s[i][j]=='O') cnt1++;
     }
    for(int i=0;i<n;i++)
    {
        scanf("%s",&s1[i]);
        for(int j=0;j<n;j++)
            if(s1[i][j]=='O') cnt1--;
    }
    bool flag;
    if(cnt1) flag=false;
    else {
        bool flag1=true,flag2=true,flag3=true,flag4=true,flag5=true,flag6=true,flag7=true,flag8=true;
        //从四个点开始读取
        char k[15][15];
        //0 0
        //向右读取
        memcpy(k,s1,sizeof(s1));
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag1=false;
                  break;
               }
        //向下读取
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                 k[i][j]=s1[j][i];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag2=false;
                  break;
               }
        //0 n-1
        //向左读取
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                k[i][j]=s1[i][n-1-j];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag3=false;
                  break;
               }
        //向下
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                 k[i][j]=s1[j][n-1-i];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag4=false;
                  break;
               }
        //n-1 0
        //向上
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                k[i][j]=s1[n-1-j][i];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag5=false;
                  break;
               }
        //向右
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                k[i][j]=s1[n-1-i][j];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag6=false;
                  break;
               }
        //n-1 n-1
        //向左
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                k[i][j]=s1[n-1-i][n-1-j];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag7=false;
                  break;
               }
        //向上
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                k[i][j]=s1[n-1-j][n-1-i];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(k[i][j]!=s[i][j]) {
                  flag8=false;
                  break;
               }
        if(flag1||flag2||flag3||flag4||flag5||flag6||flag7||flag8) flag=true;
        else flag=false;
    }
    if(flag) printf("Yes\n");
    else printf("No\n");
    return 0;
}

B1:水题(求树中叶子节点的个数)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
vector<int>G[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        G[i].clear();
    for(int i=0;i<n-1;i++)
    {
        int v1,v2;
        scanf("%d%d",&v1,&v2);
        G[v1].push_back(v2);
        G[v2].push_back(v1);
    }
    int cnt=0;
    for(int i=1;i<=n;i++)
        if(G[i].size()==1) cnt++;
    printf("%d\n",cnt);
    return 0;
}

C1:打表+暴力枚举

//打表 枚举切割点
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int main()
{
    int a[maxn];
    int n,p;
    scanf("%d%d",&n,&p);
    for(int i=0;i<n;i++)
    {
         int k;
         scanf("%d",&k);
         a[i]=k%p;
    }
    int sum1[maxn],sum2[maxn];
    int m=-1;
    sum1[0]=a[0];
    sum2[0]=a[n-1];
    //前缀和
    for(int i=1;i<n;i++)
        sum1[i]=sum1[i-1]+a[i];
    //后缀和
    for(int i=1;i<n;i++)
        sum2[i]=sum2[i-1]+a[n-i-1];
    //枚举
    for(int i=0;i<=n-2;i++)
    {
        m=max(m,(sum1[i]%p+sum2[n-2-i]%p));
    }
    printf("%d\n",m);
    return 0;
}

D1:STL 注意开double

#include<bits/stdc++.h>
using namespace std;
const int maxn=2*1e5+5;
int main()
{
    int n;
    scanf("%d\n",&n);
    map<double,int>str;
    double p[maxn];
    str.clear();
    for(int i=0;i<n;i++)
    {
        int a,b,c;
        scanf("(%d+%d)/%d\n",&a,&b,&c);
        p[i]=(double)(a+b)/c;
        str[p[i]]++;
    }
    for(int i=0;i<n;i++)
        printf("%d ",str[p[i]]);
    return 0;
}

E1:计算几何 (判断两条线段是否存在交点)(使用快速排斥粗略判断,使用跨立实验精确判断)

//判断两线段是否相交:快速排斥初步判断+跨立实验精确判断
#include<bits/stdc++.h>
using namespace std;
const double eps=0.00000001;
struct point{
double x,y;
};
struct line{
point m,n;
};
point p[15],q[15];
line k[15];
bool solve(point a,point b,point c,point d)                        //有交点返回true
{
        //快速排斥:判断以两条直线为对角线的两个矩形是否有重叠部分
        if(!(min(a.x,b.x)<=max(c.x,d.x)&&min(c.y,d.y)<=max(a.y,b.y)&&min(c.x,d.x)<=max(a.x,b.x)&&min(a.y,b.y)<=max(c.y,d.y))) return false;
       double u,v,w,z;                                                              //分别记录两个向量
       u=(c.x-a.x)*(b.y-a.y)-(b.x-a.x)*(c.y-a.y);
       v=(d.x-a.x)*(b.y-a.y)-(b.x-a.x)*(d.y-a.y);
       w=(a.x-c.x)*(d.y-c.y)-(d.x-c.x)*(a.y-c.y);
       z=(b.x-c.x)*(d.y-c.y)-(d.x-c.x)*(b.y-c.y);
       return (u*v<=eps&&w*z<=eps);
}
int main()
{
    int r,b;                //起点 终点
    scanf("%d%d",&r,&b);
    for(int i=0;i<r;i++)
        scanf("%lf%lf",&p[i].x,&p[i].y);
    for(int i=0;i<b;i++)
        scanf("%lf%lf",&q[i].x,&q[i].y);
    bool flag=false;
    if(r!=b) flag=false;
    else {
            int s[15];
            //进行排列
            for(int i=0;i<r;i++)
                s[i]=i;
            do{
                if(flag) break;
                //组建r条线段
                for(int i=0;i<r;i++)
                {
                    k[i].m=p[s[i]];
                    k[i].n=q[i];
                }
                bool f=true;
                for(int i=0;i<r-1;i++)
                    for(int j=i+1;j<r;j++)
                         if(solve(k[i].m,k[i].n,k[j].m,k[j].n)) {
                            f=false;
                            break;
                         }
                if(f) flag=true;
            }while(next_permutation(s,s+r));
    }
    if(flag) cout<<"Yes\n";
    else cout<<"No\n";
    return 0;
}

F1:在母串中寻求匹配

#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
int a[maxn],c[10005];
int cnt=0,n;
int main()
{
    int m;
    scanf("%d%d",&n,&m);
    //文本串
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int b[maxn],len=0;                  //寻找子串长度
    for(int i=0;i<m;i++)
    {
         scanf("%d",&b[i]);
         len+=b[i];
    }
     for(int i=0;i<m;i++)
    {
        for(int j=0;j<b[i];j++)
            c[cnt++]=i+1;
    }
    sort(c,c+cnt);
    /*for(int i=0;i<cnt;i++)
        cout<<c[i]<<" ";
    cout<<endl;*/
    bool flag=false;
    for(int i=0;i<n-len+1;i++)
    {
        int d[maxn],cnt1=0;
        for(int j=i;j<=i+len-1&&j<n;j++)
        {
            d[cnt1++]=a[j];
        }
        sort(d,d+cnt1);
        int x;
        for(x=0;x<cnt;x++)
            if(c[x]!=d[x]) break;
        if(x==cnt) flag=true;
        if(flag) break;
    }
    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37428263/article/details/79979329

codeforce690A2 Collective Mindsets (medium) (from :Helvetic Coding Contest 2016 online mirror )

“海盗分金”问题,n个人分m个金币(金币是最小单位,不可再分割),首先第一个人提出分配方案,当半数,或半数以上的人同意时,分配完成,不然,杀死第一个人,让第二个人进行提出分配方案,直到人全死光(当然根...
  • dpppBR
  • dpppBR
  • 2016-07-12 23:45:31
  • 778

[最大似然估计 MLE] Codeforces 802DEF Helvetic Coding Contest 2017 D. E. F. Marmots

MLE最大似然估计可以通过观察数据来估计出随机的模型和参数 最大似然估计(Maximum likelihood estimation) Maximum likelihood estimation大...
  • u014609452
  • u014609452
  • 2017-06-17 18:00:06
  • 499

[Codeforces][后缀自动机]Helvetic Coding Contest 2017 . I Fake News (hard)

一看是字符串题,就想一想怎么在后缀自动机上搞有一个跟BZOJ3238 差异差不多的思路,建出原串反串的后缀自动机,那么每个子串的lcp就是对应节点的lca,那么lcp出现次数就是这个节点的right集...
  • Coldef
  • Coldef
  • 2017-05-30 21:21:56
  • 284

Helvetic Coding Contest 2018 online mirror (teams allowed, unrated) C2.Encryption (medium)

传送门:Encryption(medium)题意:N个数,分成k个连续的序列,把每个序列的数累加取模p,求k个取模结果累加的最大值。分析:DP, 复杂度O(Nkp)设dp[i][j]为取模结果i,分为...
  • computer_user
  • computer_user
  • 2018-04-16 21:48:34
  • 11

POJ 2151 Check the difficulty of problems(概率dp)

POJ 2151 Check the difficulty of problems(概率dp)
  • u012860063
  • u012860063
  • 2015-02-06 14:44:35
  • 992

2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Prefer

2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Prefer...
  • Spylft
  • Spylft
  • 2016-10-25 12:41:34
  • 789

2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Prefer

先给一下结果: 单刷被虐成狗,ACM打到怀疑人生,I题的二分答案太丢人了,干脆退竞赛吧!! 233,脸上笑嘻嘻,心里。。。。,这个名次也是够讽刺。 上午校内ACM全场划水,草草地a了三道后,...
  • lemonoil
  • lemonoil
  • 2017-10-22 15:27:49
  • 738

UVALive 7061 Dire Wolf (dp)(The 2014 ACM-ICPC Asia Beijing Regional Contest D)

该题就是求最小花费,但不是网络流,是区间DP,算起来因该是区间DP中比较简单的那种了。 我们用dp[i][j]表示在区间[i,j]的最小花费,则它的转移状态为: for(int k=i;k...
  • moon_NO2015
  • moon_NO2015
  • 2015-08-25 11:06:05
  • 533

codeforces883I 2017-2018 ACM-ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rule

这题还是不错的,题目条件很容易想到是二分答案去做,大于k的集合的划分为了满足一个最小化最大值,这是一个二分的条件。问题是怎么check,在下只想出了笨办法,n的遍历再更新线段树,所以总共nlogn91...
  • Electrodeless_key
  • Electrodeless_key
  • 2017-11-01 19:37:12
  • 194

hdu 5988 Coding Contest (费用流)

思路:求网线被破坏的最小概率可以转化为不被破坏的最大概率来求,这个概率显然就是你要经过哪些点的(1-p)的乘积嘛,那么取个log就变成加法的了,令源点连向人数多余的点,汇点连向食物多余的点,跑一次最小...
  • qq_21057881
  • qq_21057881
  • 2016-11-22 09:08:15
  • 1167
收藏助手
不良信息举报
您举报文章:Helvetic Coding Contest 2018 online mirror (teams allowed, unrated) easy难度
举报原因:
原因补充:

(最多只允许输入30个字)