AtCoder Beginner Contest 173总结

A - Payment

#include
using namespace std;
int main()
{
    int n;
    cin>>n;
    cout<<(1000-n%1000)%1000<<endl;
    return 0;
}

B - Judge Status Summary

#include
#include
#include
#include
using namespace std;
int cnt[4];
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        if(s=="AC") cnt[0]++;
        else if(s=="WA") cnt[1]++;
        else if(s=="TLE") cnt[2]++;
        else cnt[3]++;
    }
    printf("AC x  %d\n",cnt[0]);
    printf("WA x  %d\n",cnt[1]);
    printf("TLE x  %d\n",cnt[2]);
    printf("RE x  %d\n",cnt[3]);
    return 0;
}

C - H and V

一看数据范围非常小,直接暴力,枚举。状态压缩!!!

#include
#include
using namespace std;
const int N = 6;
char g[N][N];
int n,m,k;
int res;
bool calc(int x,int y)
{
    int cnt=0;
    
    for(int i=0;i<n;i++)    
        for(int j=0;j<m;j++)
            if(x>>i&1&&y>>j&1&&g[i][j]=='#') cnt++;
    return cnt==k;
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++) cin>>g[i][j];
    for(int i=0;i<1<<n;i++) 
        for(int j=0;j<1<<m;j++)
            res+=calc(i,j);
            
    cout<<res<<endl;
    return 0;
}

D - Chat in a Circle

贪心+找规律即可

#include
#include
using namespace std;
typedef long long ll;
const int N=200010;
int a[N],n;
int main()
{
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    reverse(a,a+n);
    ll res=0;
    for(int i=1;i<n;i++) res+=a[i/2];
    cout<<res<<endl;
    return 0;
}

E - Multiplication 4

哎,这题摆弄了一下午,是个模拟题分情况太多了,下面代码仍然wa3个点,先记着吧,回头再改改。不知道能不能改正确-。-

#include
#include
#include
using namespace std;
typedef long long ll;
const int N=200010,mod=1e9+7;
ll a[N],b[N];
int cnt1,cnt2,cnt3;
int n,k;

int main()
{
    cin>>n>>k;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        if(x<0) a[cnt1++]=x;
        else if(x>0) b[cnt2++]=x;
        else cnt3++;
    }
    bool flag=(cnt2==0&&k&1)||(cnt1/2*2+cnt2<k);
    
    if(cnt3&&((cnt1+cnt2<k)||flag))
    {
        cout<<0<<endl;
        return 0;
    }
    sort(a,a+cnt1);
    sort(b,b+cnt2);
    reverse(b,b+cnt2);
    if(flag) reverse(a,a+cnt1),reverse(b,b+cnt2);
    
    ll res=1;
    int i=0,j=0;
    if(!flag)
    {
        while(k)
        {
            if(k>=2&&i<cnt1-1&&j<cnt2-1)
            {
            
                if(1ll*a[i]*a[i+1]>=1ll*b[j]*b[j+1])
                    res=a[i]*a[i+1]%mod*res%mod,i+=2;
                else 
                    res=res*b[j]%mod*b[j+1]%mod,j+=2;
                k-=2;
            }
            else if(j<cnt2)
                res=res*b[j++]%mod,k--;
            else res=res*a[i++]%mod,k--;
        }
    }
    else
    {
        while(k)
        {
            if(i<cnt1&&j<cnt2)
            {
                if(abs(a[i])<=b[j]) res=res*a[i++]%mod,k--;
                else res=res*b[j++]%mod,k--;
            }
            else if(i<cnt1) res=res*a[i++]%mod,k--;
            else res=res*b[j++]%mod,k--;
        }
    }
    cout<<(res%mod+mod)%mod<<endl;
    return 0;
}

最后一题还没有看,被E搞了一下午,回头再弄,加油!

你可能感兴趣的:(AtCoder)