1.称监测点查询
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
ll px,py;
#define N 210
struct node{
ll x,y,p;
bool operator<(const node &nd)const{
ll dis1=(this->x-px)*(this->x-px)+(this->y-py)*(this->y-py);
ll dis2=(nd.x-px)*(nd.x-px)+(nd.y-py)*(nd.y-py);
if(dis1==dis2) return p<nd.p;
return dis1<dis2;
}
} ns[N];
// 只需找出一个市民 的 距离其最近的三个监测点
// 因此我们将市民坐标设为全局变量,对所有监测点排序即可
// 监测点只有200个,不会超时
int main(){
int n;
cin>>n>>px>>py;
for(int i=0;i<n;i++){
int xx,yy;
cin>>xx>>yy;
ns[i]=(node){xx,yy,i+1};
}
sort(ns,ns+n);
for(int i=0;i<3;i++)
cout<<ns[i].p<<endl;
}
2.风险人群筛查
很简单的细节题
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 10010
//风险地区只有一个,因此可以用四个变量来存风险地区的坐标
int n,k,t,xl,yd,xr,yu;
inline bool is_in(int x,int y){
return x>=xl&&x<=xr&&y>=yd&&y<=yu;
}
int xx[N],yy[N];
int pass=0,stay=0;
void solve(){
int pp=0,ss=0;
for(int i=0;i<t;i++)
cin>>xx[i]>>yy[i];
int cnt=0;
for(int i=0;i<t;i++){
if(is_in(xx[i],yy[i])){
pp=1;
cnt++;
}else{
cnt=0;
}
if(cnt>=k) ss=1;
}
pass+=pp;
stay+=ss;
}
int main(){
cin>>n>>k>>t>>xl>>yd>>xr>>yu;
while(n--){
solve();
}
cout<<pass<<endl<<stay;
}
3.点亮数字人生
官网上可A
ACWING上wa
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define ll long long
#define N 10010
//思路 : bfs
// 每个元器件记录它连接了谁,它被谁连接
int outs[510]; //元器件的输出
int ins[2510]; //元器件的输入
int n,m;
struct conn{
char typ;
int k;
};
struct node{
string typ;
vector<int> to;
vector<conn> from;
int alive; //alive记录当前yqj有多少输入端需要被唤醒
int c; //c记录当前yqj已经唤醒了多少输入端
node(){
alive=0;
c=0;
}
int NOT(){
if(from[0].typ=='I')
return !ins[from[0].k];
else return !outs[from[0].k];
}
int AND(){
int ans=1;
for(conn cc:from){
if(cc.typ=='I')
ans&=ins[cc.k];
else ans&=outs[cc.k];
}
return ans;
}
int OR(){
int ans=0;
for(conn cc:from){
if(cc.typ=='I')
ans|=ins[cc.k];
else ans|=outs[cc.k];
}
return ans;
}
int XOR(){
int ans=0;
for(conn cc:from){
if(cc.typ=='I')
ans+=ins[cc.k];
else ans+=outs[cc.k];
}
return ans%2;
}
int NAND(){
return !AND();
}
int NOR(){
return !OR();
}
int get(){
int ans;
if(typ=="NOT"){
ans=NOT();
}else if(typ=="AND"){
ans=AND();
}else if(typ=="OR"){
ans=OR();
}else if(typ=="XOR"){
ans=XOR();
}else if(typ=="NAND"){
ans=NAND();
}else ans=NOR();
return ans;
}
}yqj[510];
int s_i(const string &s){
int ans=0;
for(int i=0;i<s.length();i++){
ans=ans*10+s[i]-'0';
}
return ans;
}
int run(vector<int> &in){ //返回该次运行是否成功
memset(outs,-1,sizeof(outs));
for(int i=1;i<=m;i++)
ins[i]=in[i-1];
queue<int> q;
//先运行再处理输出
for(int i=1;i<=n;i++){
yqj[i].c=0;
if(yqj[i].alive==0){
q.push(i);
}
}
while(q.size()){
int top=q.front();
q.pop(); //得到当前运行的元器件
int res=yqj[top].get();
outs[top]=res;
for(int to:yqj[top].to){
yqj[to].c++;
if(yqj[to].c==yqj[to].alive){
q.push(to);
}
}
}
for(int i=1;i<=n;i++){
if(outs[i]==-1) {
return false;
}
}
return true;
}
void solve(){
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>yqj[i].typ;
yqj[i].from.clear();
yqj[i].to.clear();
yqj[i].alive=0;
int k;
cin>>k;
while(k--){
string s;
cin>>s;
int c=s_i(s.substr(1));
if(s[0]=='I'){ //由输入端连接
yqj[i].from.push_back((conn){s[0],c});
}else{
yqj[i].from.push_back((conn){s[0],c});
yqj[c].to.push_back(i);
yqj[i].alive++;
}
}
} //处理完输入
vector<vector<int> > input;
int s;
cin>>s;
for(int i=0;i<s;i++){
vector<int> temp;
int t;
for(int i=0;i<m;i++){
cin>>t;
temp.push_back(t);
}
input.push_back(temp);
}
vector<vector<int> > out;
for(int i=0;i<s;i++){
vector<int> temp;
int t;
cin>>t;
while(t--){
int tt;
cin>>tt;
temp.push_back(tt);
}
out.push_back(temp);
}
for(int i=0;i<s;i++){
if(run(input[i])){
for(int j:out[i])
cout<<outs[j]<<" ";
cout<<endl;
}else {
cout<<"LOOP"<<endl;
break;
}
}
}
int main(){
int Q;
cin>>Q;
while(Q--){
solve();
}
}
200行太恶心了
4.解析几何,先跳过