Problem A. 莫卡与 MCPC
除了2输出就行
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n==2) cout<<"OK";
else cout<<"An invalid response was received from the upstream server";
if(t!=0) cout<<'\n';
}
}
Problem B. bb 去食堂
可以根据新主楼的位置,将平面直角坐标系划分为九个区域。在四角区域内的点,最 近距离为该点到对应矩形顶点连线段的长度。在空白区域内的点,最近距离为该点到对应矩形边垂线段 的长度。枚举所有点,分类讨论计算距离即可。
时间复杂度 O(n)。
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int n;
double a, b;
double x1, x2, yy, y2;//输入错了,改下
double dis;
double minn[100010];
int minni;
int i;
void countdis(int u, int v, int x, int y){
dis = pow(abs(u - x), 2) + pow(abs(v - y), 2);
dis = pow(dis, 0.5);
}
void hh(double u, double v, double y){
if(u < x1){
countdis(u, v, x1, y);
minn[i] = dis;
minni = i;
}
else if(u >= x1 && u <= x2){
minn[i] = abs(v - y);
minni = i;
}
else{
countdis(u, v, x2, y);
minn[i] = dis;
minni = i;
}
}
int main(){
cin >> n;
cin >> x1 >> x2 >> yy >> y2;
for(i = 0; i < n; i ++) {
cin >> a >> b;
if(b > y2){
hh(a, b, y2);
}
else if(b <= y2 && b >= yy){
if(a < x1){
minn[i] = x1 - a;
minni = i;
}
else{
minn[i] = a - x2;
minni = i;
}
}
else{
hh(a, b, yy);
}
}
double ss = 10000;
for(int j = 0; j < n; j ++){
if(ss > minn[j]) {
ss = minn[j];
minni = j;
}
}
cout << minni + 1 << endl;
return 0;
}
Problem C. 抵制阿草
本题可以分若干种情况讨论。
• n = 0 时,特判输出 0。
• 否则,首先考虑没有异或的情况: – 考虑第一次操作,对于每一对需要合并的数,只有最后一位不同。因此与/或后只有最后一位 变化了,其余的位没有发生改变,并且会发现这次操作后所有数的最后一位都相同。如果这次 操作是或,最后一位是 1,否则为 0。 – 考虑第 i 次操作,最后 i − 1 位完全相同,本次操作后不会发生改变。因此忽略后 i − 1 位可 变为了第一次操作的情况。 这种情况下,根据与/或的操作次序向答案添加 1, 0 即可。
• 考虑异或出现次数为 1: – 假设此时是第 i 次操作。由于所有数后 i − 1 位全部相同,因此异或后所有数的后 i − 1 位会 全部变为 0。对于第 i + 1 位及前面的位,在合并的时候,相邻的两个数一定是相同的,因此 也会全部变为 0。第 i 位则会变为 1。因此操作后所有数均会变为 2 i−1,并且会发现之后的所 有与/或对答案不会产生任何影响。
• 考虑异或出现次数大于 1: – 由于第一次异或后所有数都相同了,因此第二次异或后所有数都会变为 0,答案为 0。
时间复杂度 O(n)。