这道题是100+100+100+100+8的得分,,emmm第五题实在是耐不下心去写,也没有去搜正解,而且是模拟的时候写的,就抓紧时间暴力了前两种情况,这次的第四题就是一道数学题,如果你知道怎么用那些数学公式还真的蛮简单的,注意小数点就好了,第三题是我梦开始的地方!!!我开始练csp时是这道题给了我信心,让我开始敢碰其他的345题!!!这道题的模拟也是蛮简单的,直接上代码好了(第五题就不贴了,,,8分的代码。。)
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int id,d;
bool operator <(const node &t) const
{
if(d==t.d)
return id<t.id;
return d<t.d;
}
};
node a[210];
int n,x,y;
int main() {
cin>>n>>x>>y;
for(int i=1;i<=n;i++)
{
int x1,y1;
cin>>x1>>y1;
a[i].id=i;
a[i].d=(x1-x)*(x1-x)+(y1-y)*(y1-y);
}
sort(a+1,a+n+1);
for(int i=1;i<=3;i++)
cout<<a[i].id<<endl;
return 0;
}
#include <iostream>
using namespace std;
int n,k,t,xl,yd,xr,yu;
int ans1,ans2;
int main()
{
cin>>n>>k>>t>>xl>>yd>>xr>>yu;
while(n--)
{
int num=0,maxx=0,flag=0;
//cout<<n<<endl;
for(int i=1;i<=t;i++)
{
int x,y;
cin>>x>>y;
if(x>=xl&&x<=xr&&y>=yd&&y<=yu)
{
if(flag) num++;
else
{
maxx=max(maxx,num);
num=1;
}
//cout<<num<<endl;
flag=1;
}
else flag=0;
}
maxx=max(maxx,num);
//cout<<maxx<<endl;
if(!maxx) continue;
ans1++;
if(maxx>=k) ans2++;
}
cout<<ans1<<endl;
cout<<ans2;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N=502;
bool flag= true;//记录是否是循环队列
int out[10001][N];//n个器件
int inn[50001];//m个输入
int inv[N];//记录每一个器件的入度
vector <int> G[N];//邻接表
int m,n;
struct node{
string func;
vector <int> in ;
vector <int> out;
};
node a[N];
int stoin(string s)
{
int b;
stringstream ss;
ss<<s;
ss>>b;
return b;
}
bool tuopu(int j)
{
int num=0;
int b[n+1];
memset(b,0,sizeof b);
queue<int> q;
for(int i=1;i<=n;i++)
{
if(inv[i]==b[i])
{
q.push(i);
//cout<<i<<endl;
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
int flag1=0;//记录器件是否是第一次参与计算;
for(int i=0;i<a[u].in.size();i++)
{
int k=inn[a[u].in[i]];
if(a[u].func=="NOT")
out[j][u]=!k;
else if(i==0)
out[j][u]=k,flag1=1;
else{
if(a[u].func=="AND"||a[u].func=="NAND")
out[j][u]&=k;
else if(a[u].func=="OR"||a[u].func=="NOR")
out[j][u]|=k;
else
out[j][u]^=k;
}
}
for(int i=0;i<a[u].out.size();i++)
{
int k=out[j][a[u].out[i]];
if(a[u].func=="NOT")
out[j][u]=!k;
else if((!flag1)&&(i==0))
out[j][u]=k;
else{
if(a[u].func=="AND"||a[u].func=="NAND")
out[j][u]&=k;
else if(a[u].func=="OR"||a[u].func=="NOR")
out[j][u]|=k;
else
out[j][u]^=k;
}
}
if(a[u].func=="NAND"||a[u].func=="NOR")
out[j][u]=!out[j][u];
//cout<<u<<" :"<<out[j][u]<<endl;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
b[v]++;
//cout<<v;
if(inv[v]==b[v])
{
q.push(v);
//cout<<v<<" :"<<out[j][v]<<endl;
}
}
num++;
//cout<<num<<endl;
}
if(num==n) return true;
else return false;
}
int main()
{
int q;
cin>>q;
while(q--)
{
cin>>m>>n;
for(int i=1;i<=n;i++)
{
inv[i]=0;
cin>>a[i].func;
int k;
cin>>k;
string c,d;
for(int j=0;j<k;j++)
{
cin>>c;
d=c.substr(1);
int dd=stoin(d);
if(c[0]=='I')
{
a[i].in.push_back(dd);
}
else
{
a[i].out.push_back(dd);
inv[i]++;
G[dd].push_back(i);
}
}
}
int s;
cin>>s;
for(int j=0;j<s;j++)
{
for(int l=1;l<=m;l++)
{
cin>>inn[l];
}
if(flag)
flag=tuopu(j);
}
//第二部分,输出答案部分
for(int j=0;j<s;j++)
{
int aa;
cin>>aa;
for(int kk=0;kk<aa;kk++)
{
int h;
cin>>h;
if(flag)
cout<<out[j][h]<<' ';
}
if(flag)
cout<<endl;
}
if(!flag)
cout<<"LOOP"<<endl;
for(int i=1;i<=n;i++)
{
a[i].in.clear();
a[i].out.clear();
G[i].clear();
}
flag=1;
}
}
#include<bits/stdc++.h>
using namespace std;
const int N=100+5;//n维
const int M=2000+5;//M个点
int n,m;
double O[N],r;//O为源点
double p[M][N];//p[i]为其他星际旅行的目标
double result[M][M];//点与点之间的距离
double d[M],rd[M];//d[i]为第i个点到源点的距离,rd[i]为第i个点到与圆相切的切点的距离
int main()
{
cin>>n>>m>>r;
for(int i=1;i<=n;i++)
cin>>O[i];
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cin>>p[i][j];
for(int i=1;i<=m;i++)
{
double temp=0;
for(int j=1;j<=n;j++)
{
temp+=(p[i][j]-O[j])*(p[i][j]-O[j]);
}
d[i]=sqrt(temp);
rd[i]=sqrt(d[i]*d[i]-r*r);
}
for(int i=1;i<=m;i++)
{
for(int j=i+1;j<=m;j++)
{
double temp=0;
for(int k=1;k<=n;k++)
temp+=(p[i][k]-p[j][k])*(p[i][k]-p[j][k]);
double x=sqrt(temp); double p=(d[i]+d[j]+x)/2;
double s=sqrt(p*(p-x)*(p-d[i])*(p-d[j]));//海伦-秦九韶公式
double h=2*s/x;
if(h>=r||(x*x+d[i]*d[i]<=d[j]*d[j])||(x*x+d[j]*d[j]<=d[i]*d[i]))
{
result[i][j]=result[j][i]=x;
continue;
}
double angle1=acos((d[i]*d[i]+d[j]*d[j]-x*x)/(2*d[i]*d[j]));
double angle2=acos(r/d[i]);
double angle3=acos(r/d[j]);
result[i][j]=result[j][i]=(angle1-angle2-angle3)*r+rd[i]+rd[j];
}
}
for(int i=1;i<=m;i++)
{
double sum=0;
for(int j=1;j<=m;j++)
{
if(i==j) continue;
sum+=result[i][j];
}
printf("%.14f\n",sum);
}
return 0;
}