wannafly挑战赛4

A 解方程

题目描述

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

输入描述:

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

输出描述:

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

输入

2 1
1 -2

输出

YES
第一想法是3层循环暴力找a,b,c,但是这样肯定超时,然后就想到可以只暴力找a和b的值,再判断有没有满足使式子为0的c就可以。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

int main()
{
    int n,x,k,a[1005],vis[5005];
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&x);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        vis[a[i]+2000]=1;
    }
    sort(a,a+n);
    int flag=0,sum;;
    for(int i=0;i<n&&!flag;i++){
        for(int j=0;j<n&&!flag;j++){
            sum=a[i]*x*x+a[j]*x;
            if(sum>=-1005&&sum<=1005)
            if(vis[2000-sum]){
                flag=1;
            }
        }
    }
    if(flag)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}


c割草机

题目描述

有一块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
给两种走的规则,可以向下走但是面朝方向要改变,或者想面朝的方向一直走,一开始是面朝右的。要求割完草用的最小时间,每次先判断一下是往右走还是往左走(行为奇数向右,偶数向左),再找这一行和下一行 最左(当向左走)或最右(当向右走)边的草地在哪一列,每次都记录走的距离和走到的位置。

注意:1、有可能还没走到最后一行就结束了;

    2、max的初始值要为1;

    3、当中间有一行全为空地是直接向下走,位置不要变。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[400][400];
char x;
struct node{
    int l,r;
};
node r[400];

int main()
{
    int n,m,sum=0,maxx=1;
    scanf("%d%d",&n,&m);
    getchar();
    memset(a,0,sizeof(a));
    for(int i=0;i<366;i++){
    	r[i].l=200;
    	r[i].r=0;
	}
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%c",&x);
            if(x=='W'){
                a[i][j]=1;
                if(r[i].l>j)
                	r[i].l=j;
                if(r[i].r<j)
                	r[i].r=j;
                maxx=i;
            }
            else
                a[i][j]=0;
        }
        getchar();
    }
    sum=0;
    int t=1;
    for(int i=1;i<=maxx;i++){
    	if(i%2){
    		int tt=max(r[i].r,r[i+1].r);
    		if(tt-t>0){
    			sum+=(tt-t);
				t=tt;
			}
		}
    	else{
    		int tt=min(r[i].l,r[i+1].l);
    		if(t-tt>0){
    			sum+=(t-tt);
				t=tt;
			}
		}
	}
    printf("%d\n",sum+maxx-1);
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值