2020.06.03训练三 codeforces903

https://vjudge.net/contest/374572
A CodeForces 903A Hungry Student Problem

#include
using namespace std;
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));

typedef long long ll;
const int mod = 998244353;
const int maxn = 2e5;
using namespace std;
/***********************defination************************/
int main()
{
    int round;
    cin>>round;
    while(round--)
    {
        int tar;
        cin>>tar;
        bool flag = false;;
        int a = tar / 7;
        while(a >= 0)
        {
            if((tar - a*7)%3 == 0)
            {
                flag = true;
                break;
            }
            else a--;
        }
        if(flag)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

B - The Modcrab CodeForces - 903B

#include//poj,hdu can't use it
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));

typedef long long ll;
const int mod = 998244353;
const int maxn = 2e5;
using namespace std;
/***********************defination************************/
int main()
{
    int h1,a1,c1;
    int h2,a2;
    int ans = 0;
    cin>>h1>>a1>>c1>>h2>>a2;
    queue<string>q;
    while(1)
    {
        ans++;
        if(a1 >= h2)
        {
            q.push("STRIKE");
            break;
        }
        else if(h1 <= a2)
        {
            q.push("HEAL");
            h1 = h1 - a2 + c1;
        }
        else{
            q.push("STRIKE");
            h2-=a1;
            h1-=a2;
        }
    }
    cout<<ans<<endl;
    while(!q.empty())
    {
        string temp = q.front();
        q.pop();
        cout<<temp<<endl;
    }
    return 0;
}

C - Boxes Packing CodeForces - 903C
假想箱子已经排序过了,那么每一个相同尺寸的箱子形成造成多余的另外一组,比如 1 2 3 3,只能分成123和3;并且不同尺寸的多余箱子可以凑成一组,比如说1 2 2 3 3可以分成123和23。因此只用看每一个出现数字的最大次数。

//#include//poj,hdu can't use it
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
/************************head file************************/
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));

typedef long long ll;
const int mod = 998244353;
const int maxn = 1e9+10;
using namespace std;
/***********************defination************************/
map<int,int> q;

int main()
{
    int n;
    cin>>n;
    int Max = 1;
    for(int i = 0;i < n;i++)
    {
        int temp;
        scanf("%d",&temp);
        q[temp]++;
        Max = max(Max,q[temp]);
    }
    cout<<Max<<endl;
    return 0;
}

D - Almost Difference CodeForces - 903D
不难,但是坑人。
给了一个堆数字,遍历到第x个数字的时候,令第x个数字和前面所有数字相减。设与第y个数字相减,如果x - y的绝对值大于一则值等于x-y,小于等于一则值等于零。求这些值的总和。
不难发现,假如说1 2 3 4 6 8,到六的时候值为(6-1)+(6-2)…(6-4)=46-(1+2+3+4);八的时候为(58-1+2+3+4+6),故用一个sum记录前缀和,ans记录当前值即可,注意去掉相邻的两个数带来的影响即可。
恶心人的地方在于ans会爆ll,一般来说爆ll应该取模的…如果不知道用Long double的话可以用大数(这时候学多一个python的重要性就出来了)

#include
using namespace std;
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));

typedef long long ll;
const int mod = 998244353;
const int maxn = 1e9+10;
using namespace std;
/***********************defination************************/
map<ll,ll> m;

int main()
{
    m.clear();
    ll n;
    cin>>n;
    long double ans = 0,sum = 0;
    for (ll i = 1; i <= n; ++i)
        {
        int t;
        cin >> t;
        sum += t;
        ans += i*t - sum;
        ans -= m[t - 1];
        ans += m[t + 1];
        m[t]++;
        }
    cout << setiosflags(ios::fixed) << setprecision(0) << ans << endl;
    return 0;
}

E题字符串模拟
F题状压DP
G题网络流
代补

你可能感兴趣的:(20年6月训练赛,补题)