T196684 昕昕的不等式组(洛谷EVOI CSP信心赛)

这篇博客介绍了如何解决一元一次不等式组的问题,结合了实例和数学概念,包括解集的合并和不等式组的解。通过题目描述、输入输出格式和样例,展示了不同情况下的解题思路和解决方案,并提供了AC代码及测试结果。

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

题目描述

昕昕上七年级了,她做到了一道解一元一次不等式组的数学题。

这个一元一次不等式组共有 n 个一元一次不等式。她分别求出了每个不等式的解集,而她需要把它们合并为该不等式组的解集。

每个不等式解集都化简为了最简形式,都形如 x<ti(或 x>t_ix>ti​ 等),其中 ti​ 为常数项,x 为未知数。未知数为一个小写英文字母,会在不等号左侧;常数项为一个整数,会在不等号右侧。

所有不等式使用的不等号只有 <,>≤,≥ 四种。在输入输出中, 分别用 <=<= 和 >=>= 代替。

现在昕昕需要你求出该不等式组的解集。

输入格式

第一行为一个正整数 n 和一个小写英文字母x,分别表示有 n 个已简化的不等式解集,和不等式组中的未知数为 x。

接下来 n 行,每行为一个已化简的一元一次不等式,也就是该不等式的解集。

对于每个解集,都由未知数、一个不等号和常数项 ti​ 依次排列而成,其中未知数为第一行给出的 x。

输出格式

输出一行,即这个不等式组的解集,形如“a\ op1\ x\ op2\ ba op1 x op2 b”或“x\ op\ ax op a”等格式,其中 op1,op2op1,op2 为 <或 <=,opop 为 <,<=,>,>= 或 =,注意不要有多余的空格。

若该不等式组无解,则输出 No Answer!

输入输出样例

输入 

2 x
x>-3
x<=1

输出 

-3<x<=1

输入

3 y
y>=5
y>4
y>=-2

输出 

y>=5

输入 

4 q
q>=114514
q<-555
q>-200810
q<=-23333

输出

No Answer!

说明/提示

【样例 11 说明】

如图,为数轴上各个不等式解集的公共部分,即为该不等式组的解集,-3 < x \le 1−3<x≤1。注意 \le≤ 在输出中用 <=<= 替换。

【数据规模与约定】

本题采用捆绑测试。

  • Subtask 1(5 pts):n=1n=1。
  • Subtask 2(25 pts):n=2n=2。
  • Subtask 3(10 pts):n \le 100n≤100,-4 \times 10^4 \le t_i \le 4 \times 10^4−4×104≤ti​≤4×104。
  • Subtask 4(15 pts):n \le 10^4n≤104,-10^5 \le t_i \le 10^5−105≤ti​≤105。
  • Subtask 5(15 pts):n \le 2 \times 10^4n≤2×104。
  • Subtask 6(20 pts):n \le 5 \times 10^4n≤5×104。
  • Subtask 7(10 pts):无特殊限制。

对于 100\%100% 的数据,1 \le n \le 6 \times 10^41≤n≤6×104,-10^6 \le t_i \le 10^6−106≤ti​≤106,每个不等式中的未知数都是一个小写英文字母。

【提示】

以下为涉及到题目的一些数学知识。

不等式:用不等号联系的关系式。
不等式的解:在含有未知数的不等式中,能使不等式成立的未知数的值。
不等式的解集:不等式的解的全体。
不等式组的解集:不等式组中所有不等式的解集的公共部分。
解不等式组:求不等式组的解集的过程。

解析:

感觉,没有知识点,思维严密,注意分类讨论,考虑特殊情况,按格式输出即可,毕竟是一道普及组的题嘛~~

  AC Code: (Clean C With No STL Algorithm)

#include<cstdio>
#include<cstring>
char str[1000];
bool dayes=false;
bool xiaoyes=false;
long long xiao=0x7f7f7f7f,da=-0x7f7f7f7f;
bool dafirst=false;
bool xiaofirst=false;
int main(){
	int n;
	char c;
	scanf("%d %c",&n,&c);
    for(int i=1;i<=n;i++){
    	scanf("%s",&str);
    	int j=1;
    	while(j<strlen(str)){
		    bool fu=false;
    		bool ude=false;
    		int num=0;
    		if(str[j]=='>'){
    			dafirst=true;
    			j++;
				if(str[j]=='='){
				    ude=true;	         
					j++;
				}
	            while(j<strlen(str)){
	            	if(str[j]=='-'){
	            		j++;
	            		fu=true;
					}
	            	num=(num<<1)+(num<<3)+(str[j]^48);
	            	j++;
	            }
				if(fu){
	            	num=num*-1;
				} 
				if(num>=da){
					if(num==da){
						if(!dayes && ude){
							dayes=ude;
						}
					}
					else{
						da=num;
						dayes=ude;
					}
					if(xiao<=da){
						if(xiao==da){
							if(!(xiaoyes && dayes)){
								printf("No Answer!");
								return 0;
							}
						}
						else if(xiao<da){
							printf("No Answer!");
							return 0;
						}
					}
				}
			}
			else if(str[j]=='<'){
				xiaofirst=true;
				j++;
				if(str[j]=='='){
					ude=true;
					j++;
				}
                while(j<strlen(str)){
                	if(str[j]=='-'){
	            		j++;
	            		fu=true;
					}
                	num=(num<<1)+(num<<3)+(str[j]^48);
	            	j++;
				}
				if(fu){
	            	num=num*-1;
				} 
				if(num<=xiao){
					if(xiao==num){
						if(!xiaoyes && ude){
							xiaoyes=ude;
						}
					}
					else{
						xiaoyes=ude;
						xiao=num;
					}
					if(xiao<=da){
						if(xiao==da){
							if(!(xiaoyes && dayes)){
								printf("No answer");
								return 0;
							}
						}
						else if(xiao<da){
							printf("No Answer!");
							return 0;
						}
					}
				}
			}
		}
    }
	if(dafirst && xiaofirst){
		if(da==xiao){
			printf("%c=%lld",c,da);
			return 0;
		}
		printf("%d<",da);
		if(dayes){
			putchar('=');
		}
		printf("%c<",c);
		if(xiaoyes){
			putchar('=');
		}
		printf("%lld",xiao);
	}
	else if(dafirst || xiaofirst){
		if(dafirst){
			printf("%c>",c);
			if(dayes){
				putchar('=');
			}
			printf("%lld",da);
		}
		else if(xiaofirst){
			printf("%c<",c);
			if(xiaoyes){
				putchar('=');
			}
			printf("%lld",xiao);
		}
	}
	return 0;
}

测试结果:

Subtask #1

3ms/484.00KBAC#1Accepted, 得分 5. ok accepted

Subtask #2

2ms/624.00KBAC#2Accepted, 得分 25. ok accepted3ms/480.00KBAC#3Accepted, 得分 25. ok accepted2ms/496.00KBAC#4Accepted, 得分 25. ok accepted3ms/612.00KBAC#5Accepted, 得分 25. ok accepted2ms/480.00KBAC#6Accepted, 得分 25. ok accepted

Subtask #3

2ms/624.00KBAC#7Accepted, 得分 10. ok accepted2ms/484.00KBAC#8Accepted, 得分 10. ok accepted

Subtask #4

3ms/612.00KBAC#9Accepted, 得分 15. ok accepted3ms/636.00KBAC#10Accepted, 得分 15. ok accepted3ms/588.00KBAC#11Accepted, 得分 15. ok accepted

Subtask #5

3ms/636.00KBAC#12Accepted, 得分 15. ok accepted4ms/472.00KBAC#13Accepted, 得分 15. ok accepted3ms/648.00KBAC#14Accepted, 得分 15. ok accepted

Subtask #6

5ms/620.00KBAC#15Accepted, 得分 20. ok accepted4ms/640.00KBAC#16Accepted, 得分 20. ok accepted5ms/484.00KBAC#17Accepted, 得分 20. ok accepted4ms/632.00KBAC#18Accepted, 得分 20. ok accepted

Subtask #7

7ms/608.00KBAC#19Accepted, 得分 10. ok accepted6ms/628.00KBAC#20Accepted, 得分 10. ok accepted

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

感谢有你陪伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值