7-1 ysu小吃街 (100分)【思路超级简单的版本】

燕大食堂为了改善学生伙食,新开了一条小吃街。这里共有n个摊位,剁椒鱼头、水煮肉片、牛奶冻、红烧狮子头……各种各样的美食数不胜数,散发着诱人的香气。 SueJane和swoky非常开心地走进小吃街。这里有一条神奇的规定,如果能回答出所有小吃的价格,就可以获得免单的优惠。swoky贿赂了入口处卖可乐鸡翅的大妈,得知了标号为1的摊位(可乐鸡翅)的价格为a_1。此后SueJane和swoky每走到一个摊位,都可以获得一条信息,内容为这个摊位的小吃与另外某一个摊位的差价。现在SueJane和swoky大快朵颐之后来到出口处,发现由于她们吃了太多美食,钱不够了qwq。因此,她们必须猜出所有小吃的价格来获得免单的优惠。你这位神犇能帮她们的忙吗?

输入格式:

输入第一行为三个正整数,为n,m,a_1,分别表示摊位个数、SueJane和swoky获得的信息条数、摊位1的价格。 接下来共有m行,每行包括三个整数x,y,z,表示x摊位的价格比y摊位贵z元钱。

输出格式:

第一行为一个字符串,“QWQ”表示你太强了觉得这个问题非常简单,可以帮她们解决;“QAQ”表示由于SueJane和swoky太蠢了收集到了错误的信息或者没有收集全信息,你对此爱莫能助。 如果第一行输出了"QWQ",那么接下来输出n行每行一个整数,分别表示1~n个摊位的小吃价格。

输入样例1:

在这里给出一组输入。例如:
5 5 10
1 2 3
4 3 2
1 3 2
3 5 1
4 5 3

输出样例1:

在这里给出相应的输出。例如:
QWQ
10
7
8
10
7

输入样例2:

在这里给出一组输入。例如:
5 5 10
1 2 3
4 3 2
1 3 2
3 5 1
4 5 2

输出样例2:

在这里给出相应的输出。例如:
QAQ

输入样例3:

在这里给出一组输入。例如:
5 4 10
4 3 2
1 3 2
3 5 1
4 5 2

输出样例3:

在这里给出相应的输出。例如:
QAQ

样例说明
•样例1中,信息之间不存在矛盾的情况且可以得出所有答案。
•样例2中,第2,4,5条信息互相矛盾。
•样例3中,给出的信息不能够计算出第2个摊位的小吃价格。

数据范围及约定
在这里插入图片描述

我的看法

这道题连敲带想花了15min,一开始方向对了,一遍AC,给我很大的成就感。
自我感觉我的方法在网上的博客里算很简单的了,看了一些其他人的AC代码,还是觉得我的思路简单还容易实现。

我的思路

不停遍历所获得的信息,直到遍历了一次,没有再得到新的价格,结束遍历,检验结果,输出正确答案。
还是上代码讲解吧。

#include
using namespace std;
int a[100005];//存放价格
struct Ca {
	int x, y, difference;
};
int main() {
	int n, m;
	cin >> n >> m >> a[1];
	for (int i = 2; i <= n; i++)a[i] = -1;//除了第一个,别的价钱都不知道,初始化为-1
	Ca *prsdf = new Ca[m];
	for (int i = 0; i < m; i++) 
		cin >> prsdf[i].x >> prsdf[i].y >> prsdf[i].difference;
	bool havedif = true;//准备开始遍历,如果修改了数组a,那么就是有变化(havedifference)
	while (havedif) {
		havedif = false;
		for (int i = 0; i < m; i++) {//先来俩if,知道一个,不知道另一个,就能根据差价求出另一个
			if (a[prsdf[i].x] == -1 && a[prsdf[i].y] != -1) {
				a[prsdf[i].x] = a[prsdf[i].y] + prsdf[i].difference;
				havedif = true;
			}
			else if (a[prsdf[i].x] != -1 && a[prsdf[i].y] == -1) {
				a[prsdf[i].y]= a[prsdf[i].x]- prsdf[i].difference;
				havedif = true;
			}
			else if (a[prsdf[i].x] != -1 && a[prsdf[i].y] != -1) {//两个都知道,就判断一下是不是没有矛盾
				if (a[prsdf[i].x] != (a[prsdf[i].y] + prsdf[i].difference)) {
					cout << "QAQ";
					goto WANDAN;//有矛盾,不整了,直接goto完蛋
				}
			}
			else continue;//如果都不知道,就跳过
		}
	}
	for (int i = 2; i <= n; i++) {
		if (a[i] == -1) {//最后看一下,如果有等于-1的,就是价钱不知道
			cout << "QAQ";
			goto WANDAN;//不整了,goto完蛋
		}
	}
	cout << "QWQ" << endl;//程序走到这,说明没问题,输出a数组即可
	for (int i = 1; i <= n; i++)
		cout << a[i] << endl;

	WANDAN://完蛋了就直接deletereturn
	system("pause");
	delete[]prsdf;
	return 0;
}

你可能感兴趣的:(c++)