zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/tldr/p/11355566.html
Copyright © 2011-2022 走看看