Wannafly挑战赛4 A C

本文介绍了解决特定数学问题的算法实现,包括寻找符合条件的整数组合以解二次方程,以及规划最短路径来清除网格地图上的杂草。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A.解方程
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给出n个整数和x,请问这n个整数中是否存在三个数a,b,c使得ax2+bx+c=0,数字可以重复使用。

输入描述:

第一行两个整数n,x
第二行n个整数a[i]表示可以用的数
1 <= n <= 1000, -1000 <= a[i], x <= 1000

输出描述:

YES表示可以
NO表示不可以
示例1

输入

2 1
1 -2

输出

YES

#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
  
typedef long long ll;
  
 
int main() {
    ll a[1005];
      
    set<ll> s;
    int n;
    int x;
      
    scanf("%d %d",&n,&x);
      
    for(int i = 0;i < n;i++) {
        scanf("%lld",&a[i]);
        s.insert(a[i]);
    }
      
  
    bool flag = false;
    for(int i = 0;i < n;i++) {
        if(flag) {
            break;
        }
        for(int j = 0;j < n;j++) {
            if(flag) {
                break;
            }
            ll tmp = -(a[i] * x * x + a[j] * x);
            if(s.count(tmp)) {
                flag = true;
                break;
            }
        }
    }
     
    if(flag) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
      
    return 0;
}


c.割草机
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

有一块n*m的地,每块地要么长满杂草(用'W'表示),要么是空地(用'G'表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动:

1、向面朝的方向移动一格,耗费1单位时间

2、向下移动一格,并反转面朝的方向(右变左,左变右),耗费1单位时间

现在他想知道清除所有的杂草最少需要多少单位时间(清除完杂草之后不用返回(1,1))

输入描述:

第一行n,m
接下来n行每行一个字符串表示矩阵。
n,m<=150

输出描述:

一行一个整数表示答案。
示例1

输入

4 5
GWGGW
GGWGG
GWGGG
WGGGG

输出

11
示例2

输入

3 3
GWW
WWW
WWG

输出

7


#include <iostream>
#include <cstdio>

using namespace std;

char mp[155][155];
int l[155];
int r[155];

int main() {
    int m;
    int n;
    
    cin >> n >> m;
    for(int i = 1;i <= n;i++) {
        for(int j = 1;j <= m;j++) {
            cin >> mp[i][j];
        }
    }
    int last = 0;
    for (int i = 1;i <= n;++i){
        l[i] = m+1,r[i] = 0;
        for (int j = 1;j <= m;++j) 
            if (mp[i][j]=='W') {
                l[i] = min(l[i],j);
                r[i] = max(r[i],j);
                last = i;
            }
    }
    l[n+1] = m+1; r[n+1] = 0;
    int ans = -1;
    int now = 1;
    for (int i = 1;i <= last;++i){
        ++ans;
        if (i&1){
            int aim = max(r[i],r[i+1]); 
            aim = max(aim,now);
            ans += aim-now; 
            now = aim;
        } else {
            int aim = min(l[i],l[i+1]); 
            aim = min(aim,now);
            ans += now-aim; 
            now = aim;
        }
    }
    printf("%d\n",ans);
    
    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值