很简单的判断
优先级:&& > || 判断时一定要记得带上括号!
//代码
void solve() {
string s;
cin >> s;
if ((s[0] == 'y' || s[0] == 'Y') && (s[1] == 'e' || s[1] == 'E') &&
(s[2] == 's' || s[2] == 'S')) cout << "YES" << endl;
else cout << "NO" << endl;
}
set去重 没出现过的直接+2 出现过的直接+1 题目意思没有理解清楚直接去看样例!
//代码
void solve() {
cin >> n;
char x;
int ans = 0;
set<char> st;
for (int i = 1; i <= n; i++) {
cin >> x;
if (!st.count(x)) {
ans += 2;
st.insert(x);
}
else ans += 1;
}
cout << ans << endl;
}
很简单直接相反方向写上!
//代码
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
char c;
for (int j = 1; j <= x; j++) {
cin >> c;
if (c == 'U') a[i] = (a[i] + 9) % 10;
else a[i] = (a[i] + 1) % 10;
}
}
for (int i = 1; i <= n; i++) cout << a[i] << " ";
cout << endl;
}
1.截断字符串 看map里面是否有! so easy!
2.因为要判断每一个字符串的情况 所以要把所有的字符串先全部存起来 string s[N];
3.不会截断完所有字符!
4.substr(开始坐标,截几个)
//代码
void solve() {
cin >> n;
map<string, bool> mp;
for (int i = 1; i <= n; i++) {
cin >> s[i];
mp[s[i]] = 1;
}
for (int i = 1; i <= n; i++) {
bool flag = false;
for (int j = 1; j < s[i].size(); j++) {
string be = s[i].substr(0, j);
string ed = s[i].substr(j, s[i].size() - j);
if (mp.count(be) && mp.count(ed)) {
flag = true;
break;
}
}
if (flag) cout << 1;
else cout << 0;
}
cout << endl;
}
1. 判断中心对称的四个位置中,min(1的个数,0的个数) res+=min
2. 每次旋转交换的点都是四个一组没有变过 所以只用讲四个点赋值为同一个值就可以
3. 遇到这种题目别慌 先冷静分析一下
//代码
void solve() {
cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++) cin >> a[i] + 1;//表示从1开始输入
for(int i=1;i<=n;i++)
for (int j = 1; j <= n; j++) {
if (a[i][j] != '2') {
int cnt = 0;
cnt = a[i][j] + a[n - i + 1][n - j + 1] + a[n - j + 1][i] + a[j][n - i + 1] - 4 * '0';
ans += min(cnt, 4 - cnt);
a[i][j] = a[n - i + 1][n - j + 1] = a[n - j + 1][i] = a[j][n - i + 1] = '2';
}
}
cout << ans << endl;
}
Yet Another Problem About Pairs Satisfying an Inequality
1.直接求前缀和,不满足的剔除
2.满足的直接加上s[a[i]-1],保证大于就行!
//代码
void solve() {
cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (i > a[i]) s[i] = s[i - 1] + 1;
else s[i] = s[i - 1];
}
for (int i = 1; i <= n; i++) {
if (i > a[i]) ans += s[a[i] - 1];
}
cout << ans << endl;
}
1.永远不会在好钥匙之前遇到坏钥匙,所以优先使用好钥匙再使用坏钥匙,使用坏钥匙的个数不会超过log2(10^9)=30个箱子,之后的所有箱子都是0 2的多少次方 直接取对数
2.将两步综合到一步 每往后移一步就把上一步跳过的好钥匙情况加上!先判断坏钥匙,此情况是已经加上了前面都是好钥匙的情况了!
//代码
void solve() {
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
int ans = 0, sum = 0;//记录!
for (int i = -1; i < n; i++) {
int tmp = sum;
for (int j = i + 1; j < min(n, i + 32); j++) {
int copy = a[j];
copy >>= j - i;
tmp += copy;
}
ans = max(ans, tmp);
if (i + 1 != n) sum += a[i + 1] - k;
}
cout << ans << endl;
}