A - The Rank
题意:定义排名为:先排总分,总分相同排id,求id为1的人的rnk。
题解:implement
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
pair<int, int> p[1005];
void test_case() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
int sum = 0;
for(int j = 1, x; j <= 4; ++j) {
scanf("%d", &x);
sum += x;
}
p[i] = {-sum, i};
}
sort(p + 1, p + 1 + n);
for(int i = 1; i <= n; ++i) {
if(p[i].second == 1) {
printf("%d\n", i);
return;
}
}
}
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
int t = 1;
for(int ti = 1; ti <= t; ++ti) {
//printf("Case #%d: ", ti);
test_case();
}
}
B - The Bits
题意:有两个01串a,b,求交换a串的一对01位之后使得a|b的值变化的数量。
题解:分类讨论。显然同种字符换是没有意义的。假如某个ai=1且bi=1,那么需要把ai和某个aj=0且bj=0互换。假如某个ai=1且bi=0,那么需要把ai和某个aj=0互换。假如某个ai=0且bi=1,那么可以和aj=1且bj=0互换。假如某个ai=0且bi=0,那么可以和aj=1互换。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005], b[100005];
int cnt[2][2];
void test_case() {
int n;
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%1d", &a[i]);
for(int i = 1; i <= n; ++i) {
scanf("%1d", &b[i]);
++cnt[a[i]][b[i]];
}
ll sum = 0;
for(int i = 1; i <= n; ++i) {
if(a[i] == 0 && b[i] == 0)
sum += cnt[1][0] + cnt[1][1];
else if(a[i] == 0 && b[i] == 1)
sum += cnt[1][0];
else if(a[i] == 1 && b[i] == 0)
sum += cnt[0][0] + cnt[0][1];
else
sum += cnt[0][0];
}
printf("%lld\n", sum / 2);
}
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
int t = 1;
for(int ti = 1; ti <= t; ++ti) {
//printf("Case #%d: ", ti);
test_case();
}
}