记录每行,每列可以分隔的同桌人数,然后按照行号,列号从小到大的顺序输出前k行,前l列最大的数值即可。
#include <bits/stdc++.h>
using namespace std;
bool cmp(const pair<int,int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
int main() {
vector<int> row(1010, 0);
vector<int> column(1010, 0);
int m, n, k, l, d;
cin >> m >> n >> k >> l >> d;
for(int i = 0; i < d; i++) {
int x, y, p, q;
cin >> x >> y >> p >> q;
//行相同,选择列值中较小的进行分割
if(x == p)
column[min(y, q)] += 1;
//列相同,选择行值中较小的进行分割
else if(y == q)
row[min(x, p)] += 1;
}
//按照选择行的数目从大到小排序
vector<pair<int,int>> row1;
for(int i = 1; i <= m; i++) {
pair<int,int> k;
k.first = i, k.second = row[i];
row1.emplace_back(k);
}
sort(row1.begin(), row1.end(), cmp);
//选取前k个行,按照行号从小到大排序
vector<int> resrow;
for(int i = 0; i < k; i++)
resrow.emplace_back(row1[i].first);
sort(resrow.begin(), resrow.end());
//按照选择列的数目从大到小排序
vector<pair<int,int>> column1;
for(int i = 1; i <= n; i++) {
pair<int,int> k;
k.first = i, k.second = column[i];
column1.emplace_back(k);
}
sort(column1.begin(), column1.end(), cmp);
//选取前l个列,按照列号从小到大排序
vector<int> rescolumn;
for(int i = 0; i < l; i++)
rescolumn.emplace_back(column1[i].first);
sort(rescolumn.begin(), rescolumn.end());
//输出行号,列号从小到大排序的结果
for(int i = 0; i < k; i++) {
if(i == 0)
cout << resrow[i];
else
cout << " " << resrow[i];
}
cout << endl;
for(int i = 0; i < l; i++) {
if(i == 0)
cout << rescolumn[i];
else
cout << " " << rescolumn[i];
}
cout << endl;
return 0;
}
如果是正数,直接将其放到到第一个进行删除是最优的,如果是负数,将其在当前位置删除则是最优的。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
long long res = 0;
for(int i = 0; i < n; i++) {
long long a;
cin >> a;
if(a > 0)
res = res + a;
else
res = res + a * (i + 1);
}
cout << res << endl;
return 0;
}
直接贪心,直接算出平均的水温,再分类讨论一下即可。假如平均的水温比n个杯子里的都小,那么肯定大水缸是降温的.假如平均的水温比最大的要大,说明大水缸是升温的,不然我的大水缸的温度夹在max和min中间,那么一定是不能调节的
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
double t[N],c[N];
int main() {
double T, C;
int n;
cin >> n;
cin >> T >> C;
double v = 0.0;
v += T * C;
double tmx = 0.0, tmi = 1e9, c1 = C;
for(int i = 1; i <= n; i++) {
cin >> t[i] >> c[i];
v += t[i] * c[i];
c1 += c[i];
tmx = max(t[i], tmx);
tmi = min(t[i], tmi);
}
double temp = v/c1;
//假如合并更小.
if(temp <= tmi) {
cout << "Possible\n";
printf("%.4f\n",tmi);
} else if(temp >= tmx) {
cout << "Possible\n";
printf("%.4f\n",temp);
} else
cout << "Impossible\n";
return 0;
}
判断每个数字出现的次数,判断前后两个数字是否合法(一个个单独判断的,但是实际情况只需要单独判定几种即可)
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
while(cin >> s) {
vector<int> vis(10, 0);
bool res = true;
for(int i = 0; i < s.size() - 1; i++) {
if(!vis[s[i] - '0']) {
vis[s[i] - '0'] += 1;
if(s[i] == '1') {
if(s[i + 1] == '1') {
res = false;
break;
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
if(vis[2])
continue;
else {
res = false;
break;
}
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
if(vis[4])
continue;
else {
res = false;
break;
}
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
if(!vis[5]) {
res = false;
break;
}
}
} else if(s[i] == '2') {
if(s[i + 1] == '1') {
continue;
} else if(s[i + 1] == '2') {
res = false;
break;
} else if(s[i + 1] == '3') {
continue;
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
continue;
} else if(s[i + 1] == '8') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '9') {
continue;
}
} else if(s[i] == '3') {
if(s[i + 1] == '1') {
if(!vis[2]) {
res = false;
break;
}
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
res = false;
break;
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
if(!vis[6]) {
res = false;
break;
}
}
} else if(s[i] == '4') {
if(s[i + 1] == '1') {
continue;
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
continue;
} else if(s[i + 1] == '4') {
res = false;
break;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '7') {
continue;
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
continue;
}
} else if(s[i] == '5') {
if(s[i + 1] == '1') {
continue;
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
continue;
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
res = false;
break;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
continue;
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
continue;
}
} else if(s[i] == '6') {
if(s[i + 1] == '1') {
continue;
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
continue;
} else if(s[i + 1] == '4') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
res = false;
break;
} else if(s[i + 1] == '7') {
continue;
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
continue;
}
} else if(s[i] == '7') {
if(s[i + 1] == '1') {
if(!vis[4]) {
res = false;
break;
}
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
res = false;
break;
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
if(!vis[8]) {
res = false;
break;
}
}
} else if(s[i] == '8') {
if(s[i + 1] == '1') {
continue;
} else if(s[i + 1] == '2') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '3') {
continue;
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
continue;
} else if(s[i + 1] == '8') {
res = false;
break;
} else if(s[i + 1] == '9') {
continue;
}
} else if(s[i] == '9') {
if(s[i + 1] == '1') {
if(!vis[5]) {
res = false;
break;
}
} else if(s[i + 1] == '2') {
continue;
} else if(s[i + 1] == '3') {
if(!vis[6]) {
res = false;
break;
}
} else if(s[i + 1] == '4') {
continue;
} else if(s[i + 1] == '5') {
continue;
} else if(s[i + 1] == '6') {
continue;
} else if(s[i + 1] == '7') {
if(!vis[8]) {
res = false;
break;
}
} else if(s[i + 1] == '8') {
continue;
} else if(s[i + 1] == '9') {
res = false;
break;
}
}
} else {
res = false;
break;
}
}
vis[s[s.size() - 1] - '0'] += 1;
for(int i = 1; i <= 9; i++) {
if(vis[i] >= 2)
res = false;
}
if(res)
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
先判定“号匹配,然后判定/*匹配,其他符号则原样输出
#include <bits/stdc++.h>
using namespace std;
int main() {
string tmp;
string s;
while(getline(cin, tmp)) {
s = s + tmp + "\n";
}
for(int i = 0; i < s.size(); i++) {
if(s[i] == '\"') {
cout << s[i];
//当前是“号但是前一个字符是转义字符
if(s[i - 1] == '\\')
continue;
i += 1;
//找寻对应的”号
while(i < s.size()) {
if(s[i] == '\"') {
//当前字符是"号但是前一个字符是转义字符
if(s[i - 1] == '\\')
cout << s[i];
//前一个字符不是转义字符,和第一个"号对应
else
break;
} else
cout << s[i];
i += 1;
}
cout << s[i];
//当前是注释的前半部分
} else if(s[i] == '/' && s[i + 1] == '*') {
int idx = i;
i += 2;
bool flag = false;
while(i < s.size() - 1) {
//找到对应的后半部分注释
if(s[i] == '*' && s[i + 1] == '/') {
flag = true;
break;
}
i += 1;
}
if(flag)
i += 1;
else {
//没有找到对应的后半部分注释,返回第一个注释出现的地方
//输出第一个注释及顺序输出之后的字符
cout << s[idx] << s[idx + 1];
i = idx + 1;
}
} else
cout << s[i];
}
return 0;
}