A. Minimizing the String
链接
这个题的意思就是删除一个字母让字符串的字典序变得最小,如果字符串的顺序是abcda的话很明显我们要删除d所以我们要删除如果字母的序号是递增的话,删除最后一个递增的字符就可以了,如果例如bbbbbbbbb这种全部相同的话,就删除最后一个,使用这种贪心的思路就可以
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 200008;
signed main () {
int n;
cin >> n;
string s;
bool st[N] = {false};//标志变量,因为字符串不好直接删除
cin >> s;
int flag = 0;
for (int i = 0; i < s.size() - 1; i++) {
if (s[i] > s[i + 1]) {//如果前面的字符的值大于后面的话
st[i] = true;//将s[i]标记为删除
flag = 1;
break;//我们只找第一个这样的数,所以直接退出
}
}
if (flag == 0) {//没找到标记最后一个字符
st[s.size() - 1] = true;
for (int i = 0; i < s.size(); i++) {
if (st[i] != true) {//打印
cout << s[i];
}
}
} else {
for (int i = 0; i < s.size(); i++) {
if (st[i] != true) {
cout << s[i];//打印
}
}
}
return 0;
}
B. Ehab Is an Odd Person
链接
这个题就是通过给定条件的构造能不能让这个数列从小到大排列,很明显肯定有规律,规律就是只要存在一个奇数和偶数就一定可以构造出来,否则就构造不出来
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 100008;
int a[N];
signed main () {
int n;
int st[3] = {0};//记录奇数和偶数的数量
scanf("%lld", &n);
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
st[a[i] % 2]++;
}
if (st[0] >= 1 && st[1] >= 1) {//如果奇数和偶数的数量都超过一个
sort(a, a + n);//排序一下
for (int i = 0; i < n; i++) {
printf("%lld ", a[i]);//打印
}
} else {//否则不能排序直接打印
for (int i = 0; i < n; i++) {
printf("%lld ", a[i]);
}
}
return 0;
}
B. Absent Remainder
链接
这个题的思路还是比较清晰的,首先a%b的结果肯定是小于b的这是肯定的,所以我们找到数列里面最小的那一个数,然后用剩下的n-1个数和它配对肯定是可以满足条件的,这样问题就很简单了
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long
#define yes cout<<"YES"<<'\n'
#define no cout<<"NO"<<'\n'
using namespace std;
const int N = 200005;
void solve() {
int a[N] = {0};
int n;
scanf("%lld", &n);
for (int i = 0; i < n; i++) {
scanf("%lld", &a[i]);
}
sort(a, a + n); //先排序
int t = n - 1; //我这里从最后一个向前打印n/2个结果
for (int i = 0; i < n / 2; i++) { //打印n/2个结果
cout << a[t--] << ' ' << a[0] << '\n'; //每次打印a[t]和a[0]并且向后移
}
}
signed main () {
int t;
cin >> t;
while (t) {
solve();
t--;
}
return 0;
}
/*
1
3
2 2 2
*/
标签:11,03,删除,int,long,st,define,include,刷题
From: https://www.cnblogs.com/harper886/p/17208885.html