A. In Search of an Easy Problem
题意:问你这一串数字中有没有1
题解:模拟

#include <bits/stdc++.h>

using namespace std;

int n,v;

int main()
{
    scanf("%d",&n);
    
    for(int i = 1;i <= n;i++){
        scanf("%d",&v);
        if(v == 1){
            printf("HARD\n");
            return 0;
        }
    }
    printf("EASY\n");
    return 0;
}

B. Vasya and Cornfield
题意:问你M个点是否存在于矩形内部或者是边上
题解:写出四条边的函数表达式,计算点在函数表达式的哪个方向

#include <bits/stdc++.h>

using namespace std;

int n,d,m;

inline bool check(int x,int y){
    if(x + y < d) return false;
    if(x + y >2 * n - d) return false;
    if(x - y > d) return false;
    if(y - x > d) return false;
    return true;
}

int main()
{
    scanf("%d %d %d",&n,&d,&m);
    
    int x,y;
    for(int i = 1;i <= m;i++){
        scanf("%d %d",&x,&y);
        if(check(x,y)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

C. Vasya and Golden Ticket
题意:给定 n 个长度为 1 的数列,要求是否可以将数列分成两段或多段,使得这些段相加都相等。
题解:如果各位数字之和为0,且数字位数至少有两位。否则的话计算出各位数字之和为sum,尝试每个sum的因子,看能否划分出和为因子的多段

#include <bits/stdc++.h>

using namespace std;

int n;
char s[1000];

inline bool check(int x){
    int sum = 0;
    for(int i = 1;i <= n;i++){
        sum += s[i] - '0';
        if(sum == x) sum = 0;
        if(sum > x) return false;
    }
    return true;
}

int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    int sum = 0;
    for(int i = 1;i <= n;i++){
        sum += (int)(s[i] - '0');
    }
    if(sum == 0 && n > 1){
        printf("YES\n");
        return 0;
    } 
    for(int i = 1;i < sum;i++){
        if(sum % i == 0 && check(i)){
            printf("YES\n");
            return 0;
        }
    }
    printf("NO\n");
    return 0;
}

D. Vasya and Triangle
题意:在第一象限,x,y得坐标上限是n,m,再给你个k,让你找3个整数点,使得围成面积等于(n*m)/k,没有输出NO
Pick定理:给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积S和内部格点数目n、边上格点数目s的关系: S = n + s / 2 - 1;
题解:因为有Pick定理所以n*m/k必须为正数或者是2的整数倍否则无解。直接输出0。
如果有解的话:我们把2nm拆开成2n和m,所以我们看g是不是2n的因子,如果不是则g是m的因子所以直接输出n,和2*m/k。
如果g是2n的因子的话输出2n/g,和g*m/k。

#include <bits/stdc++.h>

using namespace std;

long long n,m,k,g;

int main()
{
    scanf("%lld %lld %lld",&n,&m,&k);
    
    if((n*m*2)%k != 0)    printf("NO\n");
    
    else 
    {
        printf("YES\n");
        printf("0 0\n");
        g = __gcd(2*n,k);
        if(g == 1){
            printf("0 %lld\n",(2*m)/k);
            printf("%lld 0\n",n);
        }else {
            printf("%lld 0\n",(2*n)/g);
            printf("0 %lld\n",(m*g)/k);
        }
    }
    return 0;
}
Last modification:December 18th, 2018 at 10:13 pm
If you think my article is useful to you, please feel free to appreciate