题面
题目描述
有一个n位数字,旺财给出m个规则。每条规则用两个整数s和c表示,规定这个n位数从左往右第s位上的数字是c。请帮zsr找到符合所有规则要求的最小的n位数,如果不存在输出-1
特别注意,除了一位数0以外,一个n位数的开头不能是0哦
输入格式
第一行输入两个正整数n和m,表示数的位数和规则的条数。
接下来m行,每行两个整数s和c,表示一条规则。
输出格式
输出满足条件的最小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;
}