first
1.相反数
简单模拟
#include<bits/stdc++.h>
using namespace std;
int a[2005];
int main()
{
// freopen("in.txt","r",stdin);
int ans=0,x,n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[x+1000]++;
}
for(int i=0;i<=1000;i++)
{
ans+=a[i]*a[2000-i];
}
printf("%d",ans);
return 0;
}
2.窗口
模拟same ~
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct window
{
int x1,y1,x2,y2,id;
}win[25];
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d %d %d %d",&win[i].x1,&win[i].y1,&win[i].x2,&win[i].y2);
win[i].id=i;
}
int x,y,flag;
for(int i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
flag=0;
for(int j=n;j>=1;j--)
if(x>=win[j].x1&&x<=win[j].x2&&y>=win[j].y1&&y<=win[j].y2){
flag=win[j].id;
win[++n]=win[j];
win[n].id=flag;
break;
}
if(flag)printf("%d\n",flag);
else printf("IGNORED\n");
}
return 0;
}
*4.无线网络
dijsktra+拆点
#include<bits/stdc++.h>
using namespace std;
const int maxn=205;
int n,m,k,r,head[maxn],ek,nk,vis[maxn][maxn],dis[maxn][maxn];
struct EDGE{
int next,v;
}e[10005];
struct Node{
int x,y;
}node[maxn];
struct que{
int x,cnt;
};
void add(int x,int y){
e[++ek].v=y;e[ek].next=head[x];head[x]=ek;
e[++ek].v=x;e[ek].next=head[y];head[y]=ek;
}
bool judge_dis(int a,int b)
{
double disx=node[a].x-node[b].x,disy=node[a].y-node[b].y;
double dis=sqrt(disx*disx+disy*disy);
return dis<=r;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d %d %d %d",&n,&m,&k,&r);
for(nk=1;nk<=n;nk++)
scanf("%d %d",&node[nk].x,&node[nk].y);
for(int i=1;i<=m;i++,nk++)
scanf("%d %d",&node[nk].x,&node[nk].y);
nk--;
for(int i=1;i<nk;i++)
for(int j=i+1;j<=nk;j++)
if(judge_dis(i,j))
add(i,j);
queue<que>q;
q.push((que){1,0});
vis[1][0]=1;
while(!q.empty())
{
que qf=q.front();
q.pop();
int cnt=qf.cnt;
for(int i=head[qf.x];i;i=e[i].next)
{
int y=e[i].v;
int ycnt=cnt+(y>n);
if(y==2)
{
printf("%d",dis[qf.x][cnt]);
return 0;
}
else if(ycnt<=k&&(!vis[y][ycnt]))
{
vis[y][ycnt]=1;
dis[y][ycnt]=dis[qf.x][cnt]+1;
q.push((que){y,ycnt});
}
}
}
return 0;
}
5.任务调度