• Codeforces Round #491 (Div. 2)


    Codeforces Round #491 (Div. 2)

    https://codeforces.com/contest/991

    A

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<ll>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 1000006
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=998244353;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 
    24 int main(){
    25     std::ios::sync_with_stdio(false);
    26     int a,b,c,n;
    27     cin>>a>>b>>c>>n;
    28     int ans=n-a-b+c;
    29     if(ans>0&&a<n&&b<n&&c<n&&n-ans>=a&&n-ans>=b&&n-ans>=c&&c<=a&&c<=b&&ans<=n) cout<<ans<<endl;
    30     else cout<<-1<<endl;
    31 }
    View Code

    B

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<ll>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 1000006
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=998244353;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 int n;
    24 int a[105];
    25 
    26 int main(){
    27     std::ios::sync_with_stdio(false);
    28     cin>>n;
    29     ll sum=0;
    30     for(int i=1;i<=n;i++) {
    31         cin>>a[i];
    32         sum+=a[i];
    33     }
    34     sort(a+1,a+n+1);
    35     if(round(sum*1.0/n)==5){
    36         cout<<0<<endl;
    37         return 0;
    38     }
    39     for(int i=1;i<=n;i++){
    40         sum+=5-a[i];
    41         if(round(sum*1.0/n)==5){
    42             cout<<i<<endl;
    43             break;
    44         }
    45     }
    46 }
    View Code

    C

    题意:a有n个糖果,在开始的时候 a 选择一个整数k,表示他每天会吃k个糖果,b也想吃糖果,他每天会吃当前数量的10%(下取整)的糖果,a先开始吃,问a选择的k值最小为多少,使得他吃的糖果的数量大于等于总数的一半。

    思路:二分最小值即可。注意:取10%的时候要用tmp/10,不能用tmp*0.1,会有精度问题(被坑了好久)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<ll>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 1000006
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=998244353;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 ll n;
    24 
    25 bool Check(ll mid){
    26     ll sum1=0,sum2=0;
    27     ll tmp=n;
    28     ll t;
    29     while(tmp){
    30         if(tmp>=mid){
    31             tmp-=mid;
    32             sum1+=mid;
    33         }
    34         else {
    35             sum1+=tmp;
    36             tmp=0;
    37         }
    38         if(tmp>=10){
    39             t=tmp/10;
    40             sum2+=t;
    41             tmp-=t;
    42         }
    43     }
    44     if(sum1>=sum2) return true;
    45     return false;
    46 }
    47 
    48 int main(){
    49     std::ios::sync_with_stdio(false);
    50     cin>>n;
    51     ll L=1,R=n,mid;
    52     while(L<=R){
    53         mid=L+R>>1;
    54         if(Check(mid)){
    55             R=mid-1;
    56         }
    57         else{
    58             L=mid+1;
    59         }
    60     }
    61     cout<<L<<endl;
    62 }
    View Code

    D

    题意:给定宽为两行的矩阵,问能放多少木块。

    思路:因为只有两行,所以直接贪心即可,把每列有空的地方能放则放,要注意,当第一列遍历到i位置时,第二列i-1位置是否为空

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<ll>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 1000006
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=998244353;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 int book[5][105];
    24 int len;
    25 string s1,s2;
    26 
    27 bool Check(int x){
    28     if(x-1>=0){
    29         if(!book[0][x]&&!book[1][x-1]&&!book[1][x]&&s1[x]=='0'&&s2[x-1]=='0'&&s2[x]=='0'){
    30             book[0][x]=1;book[1][x-1]=1;book[1][x]=1;
    31             return true;
    32         }
    33     }
    34     if(x+1<len){
    35         if(!book[0][x]&&!book[1][x+1]&&!book[1][x]&&s1[x]=='0'&&s2[x+1]=='0'&&s2[x]=='0'){
    36             book[0][x]=1;book[1][x+1]=1;book[1][x]=1;
    37             return true;
    38         }
    39         if(!book[0][x]&&!book[0][x+1]&&!book[1][x+1]&&s1[x]=='0'&&s1[x+1]=='0'&&s2[x+1]=='0'){
    40             book[0][x]=1;book[0][x+1]=1;book[1][x+1]=1;
    41             return true;
    42         }
    43         if(!book[0][x]&&!book[0][x+1]&&!book[1][x]&&s1[x]=='0'&&s1[x+1]=='0'&&s2[x]=='0'){
    44             book[0][x]=1;book[0][x+1]=1;book[1][x]=1;
    45             return true;
    46         }
    47     }
    48 
    49     return false;
    50 }
    51 
    52 int main(){
    53     std::ios::sync_with_stdio(false);
    54     cin>>s1>>s2;
    55     len=s1.length();
    56     int ans=0;
    57     for(int i=0;i<len;i++){
    58         if(!book[0][i]){
    59             if(Check(i)){
    60                 ans++;
    61             }
    62         }
    63     }
    64     cout<<ans<<endl;
    65 }
    View Code

    E

    题意:给你一个数字序列A(长度不超过18位),问有多少个序列B满足:

    1、A中所有数字都一定要在B中出现过;

    2、B中所有数字也一定要在A中出现过;

    3、序列B不能以0开头

    比如:如果看到数字2028,它可能实际的车号可能是2028,8022,2820或者是820。 而80号、22208号、52号肯定不是这辆车的号码。 而且,实际的车号不能以数字0开头,例如,数字082不能也是实际的车号。 给定看到的数字n,求出所有可能的车号种数。

    思路:枚举各个位上出现的数的个数。先不考虑前导0的情况下,车号总数为:车号位数之和的阶乘除以各个位数的个数。然后在减去前导0的情况即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<ll>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 1000006
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=998244353;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 int num[15];
    24 ll fac[20];
    25 ll sum[15];
    26 ll ans;
    27 
    28 void dfs(int pos){
    29     if(pos==10){
    30         ll co=0;
    31         for(int i=0;i<10;i++){
    32             co+=sum[i];
    33         }
    34         ll tmp=fac[co];
    35         for(int i=0;i<10;i++) tmp/=fac[sum[i]];
    36         if(sum[0]>=1) tmp-=(tmp*sum[0]/co);
    37         ans+=tmp;
    38         return;
    39     }
    40     for(int i=1;i<=num[pos];i++){
    41         sum[pos]=i;
    42         dfs(pos+1);
    43     }
    44     if(num[pos]==0) dfs(pos+1);
    45 }
    46 
    47 int main(){
    48     std::ios::sync_with_stdio(false);
    49     string str;
    50     fac[0]=1;
    51     for(int i=1;i<20;i++) fac[i]=fac[i-1]*i;
    52     cin>>str;
    53     for(int i=0;i<str.length();i++){
    54         num[str[i]-'0']++;
    55     }
    56     dfs(0);
    57     cout<<ans<<endl;
    58 }
    View Code

    F

    题意:给定n,把n简短化,比如:2000000000变成2*10^9,注意,不能使用括号,不能有2^3^4这样的形式

    思路:先预处理出满足条件的a^b的形式,然后枚举这样的式子,在需要的情况下添加‘*’和‘+’,贪心判断长度即可

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define lson l,mid,rt<<1
     4 #define rson mid+1,r,rt<<1|1
     5 #define IT set<ll>::iterator
     6 #define sqr(x) ((x)*(x))
     7 #define pb push_back
     8 #define eb emplace_back
     9 #define maxn 1000006
    10 #define eps 1e-8
    11 #define pi acos(-1.0)
    12 #define rep(k,i,j) for(int k=i;k<j;k++)
    13 typedef long long ll;
    14 typedef pair<int,int> pii;
    15 typedef pair<ll,ll>pll;
    16 typedef pair<ll,int> pli;
    17 typedef pair<pair<int,string>,pii> ppp;
    18 typedef unsigned long long ull;
    19 const long long MOD=998244353;
    20 const double oula=0.57721566490153286060651209;
    21 using namespace std;
    22 
    23 map<ll,string>mp;
    24 int main(){
    25     std::ios::sync_with_stdio(false);
    26     ll n;
    27     cin>>n;
    28     ll nn=sqrt(n);
    29     string tmp;
    30     for(ll i=2;i<=nn;i++){
    31         ll num=i*i;
    32         int co=2;
    33         while(num<=n){
    34             tmp=to_string(i)+"^"+to_string(co);
    35             if(!mp.count(num)) mp[num]=to_string(num);
    36             if(mp[num].size()>tmp.size()) mp[num]=tmp;
    37             co++;
    38             num*=i;
    39         }
    40     }
    41     string ans=to_string(n);
    42     map<ll,string>::iterator it;
    43     for(it=mp.begin();it!=mp.end();it++){
    44         tmp="";
    45         ll a=n/it->first,b=n%it->first;
    46         if(a>1){
    47             if(mp.count(a)) tmp=mp[a];
    48             else tmp=to_string(a);
    49             tmp+="*";
    50         }
    51         tmp+=it->second;
    52         if(b) tmp=tmp+"+"+(mp.count(b)?mp[b]:to_string(b));
    53         if(ans.size()>tmp.size()) ans=tmp;
    54     }
    55 
    56     cout<<ans<<endl;
    57 }
    View Code
  • 相关阅读:
    值得品味的SQL
    C# Keycode对照表
    Web安全实践(9)攻击apache
    Web安全实践(8)攻击iis6.0
    Web安全实践(11)用户名枚举
    asp.net 动态添加JavaScript方法
    Web安全实践(12)密码探测
    Web安全实践(14)嗅探,arp欺骗,会话劫持与重放攻击(下)
    委托的异常处理
    Web安全实践(13)嗅探,arp欺骗,会话劫持与重放攻击(上)
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/10618879.html
Copyright © 2020-2023  润新知