• Codeforces-Round#579 Div3


    A. Circle of Students

    找到最小值,左右试探后,找到连续的一串序列持续输出前进,直到回到原来位置,或中途退出

     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for(int i=a;i<b;i++)
     3 #define FOR2(i,a,b) for(int i=a;i<=b;i++)
     4 #define ll long long
     5 #define INF  0x3f3f3f3f;
     6 #define freopenin(a) freopen(a,"r",stdin);
     7 #define freopenout(a) freopen(a,"w",stdout);
     8 #define sf(a) scanf("%d",&a)
     9 #define sf2(a,b) scanf("%d%d",&a,&b)
    10 #define MAXN 600
    11 #define MOD 10007 
    12 using namespace std;
    13 int n,m,f[MAXN];
    14 int main()
    15 {
    16     cin>>n;
    17     while(n--)
    18     {
    19         cin>>m;int p;
    20         for(int i=0;i<m;i++)
    21         {
    22             cin>>f[i];
    23             if(f[i]==1)p=i;
    24         }
    25 //        cout<<p<<endl;
    26         if(f[p%m]-f[(p+1)%m]==-1)
    27         {
    28             int pos=p;
    29             while(f[(p+1+m)%m]-f[(p+m)%m]==1)p++;
    30             if((p-pos+1+m)%m==0)cout<<"YES"<<endl;
    31             else cout<<"NO"<<endl;
    32         }
    33         else {
    34             int pos=p;
    35             while(f[(p-1+m)%m]-f[(m+p)%m]==1)p--;
    36             if((p-pos-1+m)%m==0)cout<<"YES"<<endl;
    37             else cout<<"NO"<<endl;
    38         }
    39         
    40     } 
    41     return 0;
    42 }
    View Code

    B. Equal Rectangles

    可以推出min*max即为矩形大小,把所有棒子排个序,头尾不断收缩即可,注意棒子必须成对出现。

     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for(int i=a;i<b;i++)
     3 #define FOR2(i,a,b) for(int i=a;i<=b;i++)
     4 #define ll long long
     5 #define INF  0x3f3f3f3f;
     6 #define freopenin(a) freopen(a,"r",stdin);
     7 #define freopenout(a) freopen(a,"w",stdout);
     8 #define sf(a) scanf("%d",&a)
     9 #define sf2(a,b) scanf("%d%d",&a,&b)
    10 #define MAXN 60000
    11 #define MOD 10007 
    12 using namespace std;
    13 ll n,m,f[MAXN];
    14 ll arr[MAXN];
    15 vector<ll>q;
    16 int main()
    17 {
    18     cin>>n;
    19     memset(arr,0,sizeof(arr));
    20     while(n--)
    21     {
    22         q.clear();
    23         cin>>m;
    24         for(int i=0;i<4*m;i++)
    25         {
    26             cin>>f[i];arr[f[i]]++;
    27             q.push_back(f[i]);
    28         }
    29         bool flag=true;
    30 
    31         if(!flag)continue;
    32         sort(q.begin(),q.end());
    33         ll c=q[0]*q[q.size()-1];
    34 //        cout<<"c="<<c<<endl;
    35         for(int i=0,j=q.size()-1;i<j;i+=2,j-=2)
    36         {
    37             if(1ll*q[i]*q[j]!=c||q[i]!=q[i+1]||q[j]!=q[j-1])
    38             {
    39                 cout<<"NO"<<endl;
    40                 flag=false;
    41                 break;
    42             }
    43         }
    44         if(flag)cout<<"YES"<<endl;
    45     }
    46     return 0;
    47 }
    View Code

    C. Common Divisors

    不断对所有数求最大公约数,然后求该最大公约数的约数即可。

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
     4 #define MAXN 50000
     5 #define close ios::sync_with_stdio(false);
     6 using namespace std;
     7 ll gcd(ll a,ll b)
     8 {
     9     if(!b)return a;
    10     else return gcd(b,a%b);
    11 }
    12 int main()
    13 {
    14     close;
    15     ll n;cin>>n;
    16     ll num1;ll num2;cin>>num1;
    17     FOR(i,1,n)
    18     {
    19         cin>>num2;
    20         num1=gcd(num1,num2);
    21     }
    22     ll ans=0;ll i;
    23     for(i=1;i*i<=num1;i++)
    24     if(num1%i==0)ans+=2;
    25     i--;
    26     if(i*i==num1)ans--;
    27     cout<<ans<<endl;
    28     return 0;
    29 }
    View Code

    D. Remove the Substring 

    设输入两个字符串$s_1,s_2$,记录下$s_2$中每个字符在$s_1$中的最早开始位置,和最晚结束位置,分别存储在两个数组中$q_1,,q_2$,因为任意两个字符中间最大可删除的长度为$q_2[i+1]-q_1[i]-1$,然后取最大值即可,包括头尾。

     1 #include<iostream>
     2 #include<vector>
     3 #include<bits/stdc++.h>
     4 #define FOR(i,a,b) for(int i=a;i<b;i++)
     5 #define FOR2(i,a,b) for(int i=a;i<=b;i++)
     6 #define ll long long
     7 #define INF  0x3f3f3f3f;
     8 #define freopenin(a) freopen(a,"r",stdin);
     9 #define freopenout(a) freopen(a,"w",stdout);
    10 #define sf(a) scanf("%d",&a)
    11 #define sf2(a,b) scanf("%d%d",&a,&b)
    12 #define MAXN 6000
    13 #define MOD 10007 
    14 using namespace std;
    15 int main()
    16 {
    17     string s1,s2;cin>>s1>>s2;
    18     int p=0;int ans=0;
    19     vector<int>q1,q2;
    20     for(int i=0;i<s1.size();i++)
    21     {//左边开始 
    22         if(s1[i]==s2[p])
    23         {//记录下每个字符左边的最早位置 
    24             q1.push_back(i);
    25             p++;
    26         }
    27         if(p==s2.size())
    28         {
    29             break;
    30         }
    31         
    32     }
    33 //    cout<<ans<<endl;
    34     p=s2.size()-1;
    35     for(int i=s1.size()-1;i>=0;i--)
    36     {//右边开始
    37         if(s1[i]==s2[p])
    38         {//记录下右边的最晚位置 
    39             p--;
    40             q2.push_back(i);
    41         }
    42         if(p==-1) {
    43             break;
    44         }
    45     }
    46     sort(q1.begin(),q1.end());//左边 
    47     sort(q2.begin(),q2.end());//右边 
    48     ans=max(ans,q2[0]);
    49     ans=max(ans,(int)s1.size()-q1[q1.size()-1]-1);
    50     for(int i=0;i<q2.size()-1;i++)
    51     {
    52         ans=max(ans,q2[i+1]-q1[i]-1);
    53     }
    54     cout<<ans<<endl;
    55     return 0;
    56 }
    View Code

    E. Boxers

    贪心,先排序后,由高到低,能升高就加一,若相等就减一,最后去重计数。

     1 #include<bits/stdc++.h>
     2 #define ll long long
     3 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
     4 #define MAXN 50000
     5 #define close ios::sync_with_stdio(false);
     6 using namespace std;
     7 int main()
     8 {
     9     close;
    10     vector<int>q;
    11     int n;cin>>n;
    12     while(n--)
    13     {
    14         int num;cin>>num;q.push_back(num);
    15     }
    16     sort(q.begin(),q.end());
    17     q[q.size()-1]++;
    18     for(int i=q.size()-2;i>=0;i--)
    19     {
    20         if(q[i]>=q[i+1]&&q[i]-1!=0)q[i]--;
    21         
    22         else if(q[i]+1<q[i+1])q[i]++;
    23     }
    24     sort(q.begin(),q.end());
    25     int pos=unique(q.begin(),q.end())-q.begin();
    26     cout<<pos<<endl;
    27     return 0;
    28 }
    View Code

    F1. Complete the Projects (easy version)

    贪心,对于$val>=0$的放入门槛较低的优先队列,对于$val<0$的放入门槛+val较高的优先队列。

     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for(int i=a;i<b;i++)
     3 #define FOR2(i,a,b) for(int i=a;i<=b;i++)
     4 #define ll long long
     5 #define INF  0x3f3f3f3f;
     6 #define freopenin(a) freopen(a,"r",stdin);
     7 #define freopenout(a) freopen(a,"w",stdout);
     8 #define sf(a) scanf("%d",&a)
     9 #define sf2(a,b) scanf("%d%d",&a,&b)
    10 #define MAXN 600
    11 #define MOD 10007 
    12 using namespace std;
    13 typedef struct{
    14     int the,val;
    15 }NODE;
    16 struct cmp{
    17     bool operator()(NODE n1,NODE n2)
    18     {
    19         return n1.the>n2.the;
    20     }
    21 };
    22 struct cmp2{
    23     bool operator()(NODE n1,NODE n2)
    24     {
    25         return n1.the+n1.val<n2.the+n2.val;
    26     }
    27 };
    28 priority_queue<NODE,vector<NODE>,cmp>q;//
    29 priority_queue<NODE,vector<NODE>,cmp2>p;//
    30 vector<NODE>pp;
    31 int main()
    32 {
    33     int n,m;cin>>n>>m;
    34     for(int i=0;i<n;i++)
    35     {
    36         int num1,num2;cin>>num1>>num2;
    37         if(num2<0)p.push((NODE){num1,num2});
    38         else q.push((NODE){num1,num2});
    39     }
    40     while(!q.empty())
    41     {
    42         if(m<q.top().the){
    43             cout<<"NO"<<endl;
    44             return 0;
    45         }
    46         else {
    47             m=m+q.top().val;
    48             q.pop();
    49         }
    50     }
    51     while(!p.empty())
    52     {
    53 //        cout<<p.top().the<<endl;
    54         if(m<p.top().the)
    55         {
    56             cout<<"NO"<<endl;
    57             return 0;
    58         }
    59         else 
    60         {
    61             m=m+p.top().val;
    62             p.pop();
    63         }
    64     }
    65     if(m<0)cout<<"NO"<<endl;
    66     else cout<<"YES"<<endl;
    67     return 0;
    68 }
    View Code

    F2. Complete the Projects (hard version)

    贪心+背包dp,对于$val>=0$的放入门槛较低的优先队列,与easy version相同,对于$val<0$的放入门槛+val较高的数组,进行背包dp。

    状态转移为:

    $ if(j+i.val>=0&&j>=i.threshold)  dp[i+1][j+i.val]=max(dp[i+1][j+i.val],dp[i][j]+1) $

    $dp[i+1][j]=max(dp[i+1][j],dp[i][j])$

    $i表示状态,j表示背包容纳$

     1 #include<bits/stdc++.h>
     2 #define FOR(i,a,b) for(int i=a;i<b;i++)
     3 #define FOR2(i,a,b) for(int i=a;i<=b;i++)
     4 #define ll long long
     5 #define INF  0x3f3f3f3f;
     6 #define freopenin(a) freopen(a,"r",stdin);
     7 #define freopenout(a) freopen(a,"w",stdout);
     8 #define sf(a) scanf("%d",&a)
     9 #define sf2(a,b) scanf("%d%d",&a,&b)
    10 #define MAXN 600
    11 #define MOD 10007 
    12 using namespace std;
    13 typedef struct{
    14     int the,val;
    15 }NODE;
    16 struct cmp{
    17     bool operator()(NODE n1,NODE n2)
    18     {
    19         return n1.the>n2.the;//xiao
    20     }
    21 };
    22 bool cmp2(NODE n1,NODE n2)
    23 {
    24     return n1.the+n1.val>n2.the+n2.val;
    25 }
    26 priority_queue<NODE,vector<NODE>,cmp>q;//
    27 vector<NODE>p;
    28 int dp[200][40000];
    29 int main()
    30 {
    31     int n,m;cin>>n>>m;
    32     for(int i=0;i<n;i++)
    33     {
    34         int num1,num2;cin>>num1>>num2;
    35         if(num2<0)p.push_back((NODE){num1,num2});
    36         else q.push((NODE){num1,num2});
    37     }
    38     int cnt=0;
    39     while(!q.empty())
    40     {
    41         if(m<q.top().the)
    42         {
    43             break;
    44         }
    45         else {
    46             cnt++;
    47             m+=q.top().val;
    48             q.pop();
    49         }
    50     }
    51     memset(dp,0,sizeof(dp)); 
    52     sort(p.begin(),p.end(),cmp2);
    53     for(int i=0;i<p.size();i++)
    54     {
    55         for(int j=0;j<=m;j++)
    56         {
    57             if(j>=p[i].the&&j+p[i].val>=0)
    58             {//合法状态 
    59                 dp[i+1][j+p[i].val]=max(dp[i+1][j+p[i].val],dp[i][j]+1);
    60             }
    61             //不合法状态
    62             dp[i+1][j]=max(dp[i+1][j],dp[i][j]); 
    63         }
    64     }
    65     int ans=0;
    66     for(int i=0;i<=m;i++)ans=max(ans,dp[p.size()][i]);
    67     cout<<cnt+ans<<endl;
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    基于JavaFXWJFXGameEngine游戏引擎介绍与进度
    进程线程与cpu绑定
    [Vim练级攻略] Vim基础操作
    hdu 2159 fate
    python的httplib注意事项
    SQL优化总结
    项目整体开发流程以及配置人员
    hdu 1010 解题报告 Tempter of the Bone
    在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
    int 和bigint差别有多大?
  • 原文地址:https://www.cnblogs.com/tldr/p/11355566.html
Copyright © 2020-2023  润新知