• AtCoder Beginner Contest 203 A-E


    随便更更。。

    A:

    题意:输入三个数a、b、c,如果有两数相同输出第三个数;否则输出0。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <queue>
     6 #include <map>
     7 #include <set>
     8 #include <cstring>
     9 using namespace std;
    10 typedef pair<int,int> P;
    11 typedef long long ll;
    12 const int INF=0x7fffffff;
    13 const int eps=1e-7;
    14 const long long mod=1e9+7;
    15 int main(void)
    16 {
    17   int a,b,c;
    18   cin>>a>>b>>c;
    19   int x=a^b^c;
    20   if(x==a||x==b||x==c)cout<<x<<endl;
    21   else cout<<0<<endl;
    22   return 0;
    23 }

    B:

    题意:求i0j的和,其中1 <= i <= N ,1 <= j <= K。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <queue>
     6 #include <map>
     7 #include <set>
     8 #include <cstring>
     9 using namespace std;
    10 typedef pair<int,int> P;
    11 typedef long long ll;
    12 const int INF=0x7fffffff;
    13 const int eps=1e-7;
    14 const long long mod=1e9+7;
    15 long long sum,n,k;
    16 int main(void)
    17 {
    18     cin>>n>>k;
    19     for(int i=1;i<=n;++i)
    20     {
    21         for(int j=1;j<=k;++j)
    22         {
    23             sum+=i*100+j;
    24         }
    25     }
    26     cout<<sum<<endl;
    27     return 0;
    28 }

    C:

    题意:

    从下标0出发,每前进一步需要1元,刚开始有K元,且有N个朋友,第i个朋友在下标ai,可以给你bi元,求能到达的最远下标。

    分析:排序后对朋友顺序遍历即可。(刚开始还以为数据是升序的。。)

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <queue>
     6 #include <map>
     7 #include <set>
     8 #include <cstring>
     9 using namespace std;
    10 typedef pair<int,int> P;
    11 typedef long long ll;
    12 const int INF=0x7fffffff;
    13 const int eps=1e-7;
    14 const long long mod=1e9+7;
    15 const int maxn=210000;
    16 long long n,k,r=1;
    17 struct fd
    18 {
    19     long long a,b;
    20 }f[maxn];
    21 bool cmp(fd p,fd q)
    22 {
    23     return p.a<q.a;
    24 }
    25 int main(void)
    26 {
    27     cin>>n>>k;
    28     for(int i=1;i<=n;++i)cin>>f[i].a>>f[i].b;
    29     sort(f+1,f+1+n,cmp);
    30     while(r<=n&&k>=f[r].a-f[r-1].a)k=k-f[r].a+f[r-1].a+f[r++].b;
    31     cout<<f[r-1].a+k<<endl;
    32     return 0;
    33 }

    D:

    题意:给定一个N*N的矩阵,每个位置上有一个元素,现求其中一个K*K的矩阵(K<=N),使得矩阵所有元素中的中位数最小,输出最小的中位数。

    分析:看到最小最大容易想到二分,看到矩阵容易想到前缀和。假设当前的最小中位数为x,我们利用前缀和统计在一个K*K矩阵中有多少个元素是不大于x的。假设当前位置的元素大于x,那么该位置的前缀和减一;否则加一,即前缀和方程为pre[i][j]=pre[i][j-1]+pre[i-1][j]-pre[i-1][j-1]+(a[i][j]<=x?1:-1)。然后枚举右下角的坐标(i,j),判断是否存在一个pre[i][j],满足pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k]<=0,如果有说明x成立,二分向左移动;否则二分向右移动。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <queue>
     6 #include <map>
     7 #include <set>
     8 #include <cstring>
     9 using namespace std;
    10 typedef pair<int,int> P;
    11 typedef long long ll;
    12 const int INF=0x7fffffff;
    13 const int eps=1e-7;
    14 const long long mod=1e9+7;
    15 int n,k,a[810][810],pre[810][810];
    16 bool check(int mid)
    17 {
    18     for(int i=1;i<=n;++i)
    19     {
    20         for(int j=1;j<=n;++j)
    21         {
    22             pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];
    23             if(a[i][j]>mid)pre[i][j]++;
    24             else pre[i][j]--;
    25         }
    26     }
    27     for(int i=k;i<=n;++i)
    28     {
    29         for(int j=k;j<=n;++j)
    30         {
    31             if(pre[i][j]-pre[i-k][j]-pre[i][j-k]+pre[i-k][j-k]<=0)return true;
    32         }
    33     }
    34     return false;
    35 }
    36 int main(void)
    37 {
    38     cin>>n>>k;
    39     for(int i=1;i<=n;++i)
    40     {
    41         for(int j=1;j<=n;++j)cin>>a[i][j];
    42     }
    43     int l=0,r=1e9;
    44     while(l<r)
    45     {
    46         int mid=(l+r)/2;
    47         if(check(mid))r=mid;
    48         else l=mid+1;
    49     }
    50     cout<<r<<endl;
    51     return 0;
    52 }

    E:

    题意:行、列下标均为0到2N,刚开始白块在(0,N)的位置,有M个黑块,对于所在位置(i,j),在不越过边界的前提下白块可以移动到(i+1,j+1)或(i+1,j-1)的黑块上或者移动到(i+1,j)的非黑块上,求Y的数量,其中Y为白块到达下边界(2N,Y)的第二坐标。

    分析:刚开始看错题浪费了大半时间,以为不能跳到黑块上。。。用一个set记录答案,设为ans,刚开始ans只有一个元素n。对于某一个黑块(x,y),它只会影响上面的三个位置(x-1,y-1),(x-1,y),(x-1,y+1),由于一个位置可能受到多个黑块影响,我们不妨一次考虑一行的黑块,记录所有被影响到的位置,不妨记录在set中,设为temp。再设一个pass记录当前行所能到达的位置,对于某一个被影响的位置(x,y),假设它是可到达的,如果要移动到下一行,那么要满足(x+1,y-1)或者(x+1,y+1)为黑块,或者(x+1,y-1)为非黑块,如果条件成立则将新的坐标加入到pass中。处理完一行的黑块后,从ans中去掉temp,并加入pass。最后的ans即为答案。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstdio>
     4 #include <vector>
     5 #include <queue>
     6 #include <map>
     7 #include <set>
     8 #include <cstring>
     9 using namespace std;
    10 typedef pair<int,int> P;
    11 typedef long long ll;
    12 const int INF=0x7fffffff;
    13 const int eps=1e-7;
    14 const long long mod=1e9+7;
    15 const int maxn=210000;
    16 int n,m,x[maxn],y[maxn];
    17 int main(void)
    18 {
    19     cin>>n>>m;
    20     map<int,set<int>>mp;
    21     for(int i=0;i<m;++i)cin>>x[i]>>y[i],mp[x[i]].insert(y[i]);
    22     set<int>ans;
    23     ans.insert(n);
    24     for(auto it=mp.begin();it!=mp.end();++it)
    25     {
    26         set<int>temp;
    27         for(auto pos:it->second)
    28         {
    29             temp.insert(pos-1);
    30             temp.insert(pos+1);
    31             temp.insert(pos);
    32         }
    33         set<int>pass;
    34         for(auto pos:temp)
    35         {
    36             if(ans.count(pos-1)&&it->second.count(pos)||ans.count(pos)&&!it->second.count(pos)||ans.count(pos+1)&&it->second.count(pos))pass.insert(pos);
    37         }
    38         for(auto pos:temp)
    39         {
    40             if(ans.count(pos))ans.erase(pos);
    41         }
    42         for(auto pos:pass)
    43         {
    44             ans.insert(pos);
    45         }
    46     }
    47     cout<<ans.size()<<endl;
    48     return 0;
    49 }

    F:

    待补。

    终究独木难支。
  • 相关阅读:
    [C++ Primer Plus] 第9章、内存模型和名称空间(二)课后习题
    [C++ Primer Plus] 第9章、内存模型和名称空间(一)程序清单
    [c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
    [c/c++] programming之路(27)、union共用体
    [c/c++] programming之路(26)、结构体
    opencv学习之路(37)、运动物体检测(二)
    [Python]基础教程(4)、Python 变量类型
    opencv学习之路(36)、运动物体检测(一)
    opencv学习之路(35)、SURF特征点提取与匹配(三)
    opencv学习之路(34)、SIFT特征匹配(二)
  • 原文地址:https://www.cnblogs.com/yanying7/p/14833771.html
Copyright © 2020-2023  润新知