最小的N位数

题面

题目描述

有一个n位数字,旺财给出m个规则。每条规则用两个整数sc表示,规定这个n位数从左往右第s位上的数字是c。请帮zsr找到符合所有规则要求的最小的n位数,如果不存在输出-1

特别注意,除了一位数0以外,一个n位数的开头不能是0

输入格式

第一行输入两个正整数nm,表示数的位数和规则的条数。

接下来m行,每行两个整数sc,表示一条规则。

输出格式

输出满足条件的最小n位数,如果不存在答案,输出-1

输入输出样例

输入 #1                                                  输出 #1
3 3                                    702
1 7
3 2
1 7

输入 #2                                                  输出 #2

3 2                                    -1
2 1
2 3

输入 #3                                                  输出 #3

3 1                                    -1
1 0
 

数据范围:

1≤n≤3

0≤m≤5

1≤s≤n

0≤c≤9

正解

这道题不难,但是很坑(╬▔皿▔)╯

要注意以下几种特殊情况:

        1.m==0时,如果n==1直接输出0;

                           如果n!=1 先输出1,后面补0(100,10);

        2.记得初始化

        3.给出的条件可能有矛盾(っ °Д °;)っ,比如是第一位为0,互相冲突……具体看我代码

        4.没给的位置补1或0

        5.按道理说,第一位补位应该补1,但如果n==1,即一位数,那么就可以补0

        6.旺财的规则是可以说某一位是0的,所以是有可能因为这个冲突(¬_¬ )

但是光说说这些木有用,所以老规矩,ヾ(≧▽≦*)o

STD:

正解,如果有没考虑的情况,请指出^_^

//丑陋的代码

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <stack>
#include <vector>
#include <set>
#include <cstdio>
#include <cmath>

using namespace std;

int main(){
	int n,m;
	cin>>n>>m;
	int s,c;
	int a[5]={0};
	int v[5]={0};
	if(n==1&&m==0){
		cout<<0;
		return 0;
	}
	if(m==0){
		cout<<1;
		for(int i=1;i<n;i++){
			cout<<0;
		} 
		return 0;
	}
	for(int i=1;i<=m;i++){
		cin>>s>>c;
		if(a[s]!=c&&v[s]==1){//矛盾了怎么办 
			cout<<-1;
			return 0;
		}
		else{
			v[s]=1;
			a[s]=c;
		}
	}
	int f=0;
	for(int i=1;i<=n;i++){
		if(f==1||a[i]!=0){
			cout<<a[i];
			f=1;
		}
		else if(i==n){
			cout<<0;
		}
		else if(i==1){
			if(v[1]!=1){
				cout<<1;
				f=1;
			}
			else{//矛盾了怎么办 
				cout<<-1;
				return 0;
			}
		}
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值