为表示关系x>=y>=z,应使用啥C语言表达式??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为表示关系x>=y>=z,应使用啥C语言表达式??相关的知识,希望对你有一定的参考价值。
x>=y&&y>=z。
&&称为逻辑与运算符。如果两个操作数都非零,则条件为真。$a && $b,And(逻辑与),TRUE,如果 $a 与 $b 都为 TRUE。
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。逻辑运算符包括! 非、&&与 ||或。“与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同。
扩展资料:
1、优先级与求值顺序无关。如a+b && b*c,虽然*优先级最高,但这个表达式求值顺序是从左到右。
2、优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
3、相同优先级中,按结合性进行结合。大多数运算符结合性是从左到右,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。
4、基本的优先级需要记住:
指针最优,单目运算优于双目运算。如正负号。先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7等价于 (1 << (3 + 2))&7,逻辑运算最后结合。
参考资料:
百度百科-逻辑运算符
百度百科-运算符优先级
表示关系x>=y>=z 在C语言中,应该用 x>=y && y>=z来表示。
x>=y>=z 这种写法是数学上的表达方法
在C语言中,如果写成这样,程序编译并不报错,这也是一个合法的逻辑运算表达式。先计算x>=y,结果是真(1)或假(0),然后再用这个结果与z进行比较,得到最终结果。这个结果与x>=y && y>=z的结果不一定相同,进而出现程序运行BUG。
因此,一定要正确使用C语言的表达式,来表达数学运算。
相类似的容易犯的错误还有:
2x+y 在C语言中一定要写成:2*x+y
2的n次方(2^n) 在C语言中要写成pow(2,n) ,通过相应的函数来实现
数学上是先有公式,再代入值计算。而计算机必须要先得到值,再按公式列出表达式进行计算。
Codeforces Round #635 (Div. 2)
比赛链接:https://codeforces.com/contest/1337
A. Ichihime and Triangle
题意
有正整数 $a,b,c,d$ ,选取 $a≤x≤b≤y≤c≤z≤d$,使得长为 $x,y,z$ 的三边能构成三角形。
思路
$x≤y≤z$,所以若想 $x+y>z$,$x$ 应尽可能大 ,$z$ 应尽可能小,即 $x=b$,$z=c$,所以 $b≤y≤c$,对该区间进行二分求 $y$ 的值即可,当然你也可以直接输出bcc。
代码
#include <bits/stdc++.h> using namespace std; void solve() { int a, b, c, d; cin >> a >> b >> c >> d; int l = b, r = c; while (l + 1 < r) { int mid = (l + r) / 2; if (b + mid > c) { r = mid; } else { l = mid + 1; } } if (b + l > c) cout << b << ‘ ‘ << l << ‘ ‘ << c << " "; else cout << b << ‘ ‘ << r << ‘ ‘ << c << " "; } int main() { int t; cin >> t; while (t--) solve(); }
B. Kana and Dragon Quest game
题意
可以进行 $n$ 次 $x=lfloorfrac{x}{2} floor+10$,$m$ 次 $x=x-10$ 的操作,$x$ 最终能否小于等于 $0$。
思路
$lfloorfrac{x}{2} floor+10≤x {Rightarrow} x > 20$。
代码
#include <bits/stdc++.h> using namespace std; void solve() { int x, n, m; cin >> x >> n >> m; while(x > 20 && n > 0) { x = x / 2 + 10; --n; } if (x <= 10 * m) cout << "YES" << " "; else cout << "NO" << " "; } int main() { int t; cin >> t; while (t--) solve(); }
C. Linova and Kingdom
题意
从有 $n$ 个结点的树中选取 $k<n$ 个结点,求从 $k$ 个结点出发到结点 $1$ 路上所能访问到的未选取结点的个数之和的最大值(重复计数)。
思路
首先肯定是优先选取最深的叶子结点,其次就是权衡较深的父节点和较浅的叶子结点,如果我们要选取一个较深的父节点,那么它的更优的子结点一定已经被选过了,所以可以据此计算选取每个结点的收益,即 $depth - son\_num$,取前 $k$ 大即可。
代码
#include <bits/stdc++.h> using namespace std; const int M = 2e5 + 100; vector<int> e[M], v; int dfs(int u, int p, int dep) { int son = 1; for (int v : e[u]) { if (v != p) { son += dfs(v, u, dep + 1); } } v.push_back(dep - son + 1); return son; } int main() { int n, k; cin >> n >> k; for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } dfs(1, 0, 0); sort(v.rbegin(), v.rend()); cout << accumulate(v.begin(), v.begin() + k, 0LL); }
D. Xenia and Colorful Gems
题意
从三个数组中各取一个数,使得三者不等且两两之差的平方和最小。
思路
三个数存在关系:$a<b<c$,只有枚举中间的 $b$ 才能保证求得的 $a,c$ 一定是最优的(反例见test1-case4)。
代码
#include <bits/stdc++.h> #define resz resize #define ub upper_bound #define lb lower_bound #define bg(x) x.begin() #define ed(x) x.end() #define all(x) x.begin(), x.end() #define n_p next_permutation #define LL long long using namespace std; inline LL cal(LL a, LL b, LL c) { return (a - b) * (a - b) + (b - c) * (b - c ) + (a - c) * (a - c); } void solve() { int sz[3]; for (int &i : sz) cin >> i; vector<int> v[3]; for (int i = 0; i < 3; i++) { v[i].resz(sz[i]); for (int &j : v[i]) cin >> j; sort(all(v[i])); } LL ans = LLONG_MAX; int p[] = {0, 1, 2}; do { for (int b : v[p[1]]) { auto a = ub(all(v[p[0]]), b); auto c = lb(all(v[p[2]]), b); if (a != bg(v[p[0]]) and c != ed(v[p[2]])) { --a; ans = min(ans, cal(*a, b, *c)); } } } while(n_p(p, p + 3)); cout << ans << " "; } int main() { int t; cin >> t; while (t--) solve(); }
以上是关于为表示关系x>=y>=z,应使用啥C语言表达式??的主要内容,如果未能解决你的问题,请参考以下文章