CF1195 ( Round #574 (Div. 2))

A - Drinks Choosing

对偶数的物品直接加.

奇数的物品每两种再加一个

最后讨论人数为奇数情况.

#include <bits/stdc++.h>
using namespace std;
 
int b[1005];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        int a;
        cin>>a;
        b[a]++;
    }
    int num=0;
    int m=0;
    for(int i=1;i<=k;i++){
        if(b[i]%2==0){
            num+=b[i];
        }
        else{
            num+=((b[i])/2*2);
            m++;
            if(m%2==0){
                num++;
            }
        }
    }
    if(n%2!=0&&m%2!=0){
 
            num++;
    }
    cout<<num<<endl;
 
 
}

 

B - Sport Mafia

解方程

两种状态

设x次增加

则n-x次减少

解方程

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
ll n,k;
 
int main()
{
    cin>>n>>k;
 
    ll a=1;
    ll b=3;
    ll c=-(2*k+2*n);
 
    ll o=b*b-4*a*c;
    o =sqrt(o);
 
    ll ans=(-b+o)/2;
    ans=n-ans;
    cout<<ans<<endl;
 
 
 
}

 

 

C - Basketball Exercise

递推

三种选择:选上|选下|不选

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+5;
ll n;
ll h[maxn][2];
ll dp[maxn][3];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>h[i][0];
    }
    for(int i=1;i<=n;i++){
        cin>>h[i][1];
    }
    for(int i=1;i<=n;i++){
 
        dp[i][0]=max(dp[i-1][2]+h[i][0],dp[i-1][1]+h[i][0]);
        dp[i][1]=max(dp[i-1][2]+h[i][1],dp[i-1][0]+h[i][1]);
        dp[i][2]=max(dp[i-1][2],max(dp[i-1][0],dp[i-1][1]));
        //cout<<dp[i][0]<<' '<<dp[i][1]<<' '<<dp[i][2]<<endl;
 
    }
    cout<<max(dp[n][2],max(dp[n][0],dp[n][1]))<<endl;
 
}

 

 

D2 - Submarine in the Rybinsk Sea (hard edition)

对于每个a,与其他数配对时结果只取决于位数和先后.

如   12 和 4位数 一定为   OO1O2O 或 OOO1O2

ai的贡献为  \sum ((make(a[i],j)*len[j]) + (make(a[i],j)*len[j]))

make和make1 为ai在前或在后的两种情况 

len[j] :j位数的个数。

 

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int maxn = 1e5+5;
ll n;
ll a[maxn];
ll mod = 998244353;
ll len[11];
 
ll make(ll x,int lb)
{
    char s[100]{};
    itoa(x,s+1,10);
    int la=strlen(s+1);
    ll ans=0;
    if(la>=lb){
 
        int nowa=1,nowb=1;
        for( ; nowa<=la-lb+1;nowa++)
        {
            ans*=10;
            ans+=(s[nowa]-'0');
 
        }
        while(nowb<=lb||nowa<=la)
        {
            if(nowb<=lb){
                ans*=10;
                ans+=0;
                nowb++;
            }
            if(nowa<=la){
                ans*=10;
                ans+=(s[nowa]-'0');
                nowa++;
            }
        }
    }
    else{
        int nowa=1,nowb=1;
        for( ; nowb<=lb-la;nowb++)
        {
            ans*=10;
            ans+=0;
 
        }
        while(nowb<=lb||nowa<=la)
        {
 
            if(nowa<=la){
                ans*=10;
                ans+=(s[nowa]-'0');
                nowa++;
            }
            if(nowb<=lb){
                ans*=10;
                ans+=0;
                nowb++;
            }
        }
 
    }
    ans%=mod;
    return ans;
 
}
 
ll make1(ll x,int la)
{
    char s[100]{};
    itoa(x,s+1,10);
    int lb=strlen(s+1);
    ll ans=0;
    if(la>=lb){
 
        int nowa=1,nowb=1;
        for( ; nowa<=la-lb+1;nowa++)
        {
            ans*=10;
            ans+=0;
 
        }
        while(nowb<=lb||nowa<=la)
        {
            if(nowb<=lb){
                ans*=10;
                ans+=(s[nowb]-'0');
                nowb++;
            }
            if(nowa<=la){
                ans*=10;
                ans+=0;
                nowa++;
            }
        }
    }
    else{
        int nowa=1,nowb=1;
        for( ; nowb<=lb-la;nowb++)
        {
            ans*=10;
            ans+=(s[nowb]-'0');
 
        }
        while(nowb<=lb||nowa<=la)
        {
 
            if(nowa<=la){
                ans*=10;
                ans+=0;
                nowa++;
            }
            if(nowb<=lb){
                ans*=10;
                ans+=(s[nowb]-'0');
                nowb++;
            }
        }
 
    }
    ans%=mod;
    return ans;
 
}
 
int main()
{
 
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1);
 
    for(int i=1; i<=n; i++)
    {
 
        char s[100];
        itoa(a[i],s,10);
        int l=strlen(s);
 
        len[l]++;
 
    }
 
    ll sum=0;
    for(int i=1;i<=n;i++){
 
        for(int j=1;j<=11;j++){
 
            sum+=(make(a[i],j)*len[j]);
            sum%=mod; 
            sum+=(make1(a[i],j)*len[j]);
            sum%=mod;

 
        }
 
    }
 
    cout<<sum<<endl;
 
}

 

E - OpenStreetMap

没做出来,留坑……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值