比赛
此题描述不清楚,若v[i]-v[j]>=k那么速度大的人会获胜,否则两人都有可能胜出(随机淘汰两者中的一个),例如1 2 3 4 5 6 7 8 9 10 k=2则ans=10不是3。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
long long a[100005];
int main()
{
//freopen("pk.in","r",stdin);
//freopen("pk.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(NULL);
long long k;
int t,n;
long long num;
cin>>t;
while(t--)
{
num=1;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=n;i>=2;i--)
{
if(a[i]-a[i-1]<=k)
num++;
else break;
}
cout<<num<<endl;
}
return 0;
}
游戏暂且跳过,想通后再写。
星星
要求找出由如图4个点5条边组成的图有多少个。从每个点出发,把它连的边的对面的点做标记,再从对面出发找与它直接相连的点中有无已经打过标记的点,若有则更新答案。、
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<ctime> #include<algorithm> using namespace std; int r[100005],next[400005],first[100005],to[400005]; int vis[100005]; int t,n,m,x,y,tot=0,cnt=0; long long ans=0; int read() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f; } void add(int x,int y) { next[++tot]=first[x]; first[x]=tot; to[tot]=y; } void calc(int u) { for(int i=first[u];i;i=next[i]) vis[to[i]]=u; for(int i=first[u];i;i=next[i]) { int v=to[i]; cnt=0; if(r[u]>=r[v]) { if(r[u]==r[v]&&u>v) continue; for(int j=first[v];j;j=next[j]) if(vis[to[j]]==u) cnt++; ans+=(long long)((cnt-1)*cnt/2); } } } int main() { //freopen("k.in","r",stdin); //freopen("k.out","w",stdout); t=read(); while(t--) { ans=0; tot=0; memset(first,0,sizeof(first)); memset(vis,0,sizeof(vis)); memset(r,0,sizeof(r)); n=read(); m=read(); for(int i=1;i<=m;i++) { x=read(); y=read(); r[x]++; r[y]++; add(x,y); add(y,x); } for(register int i=1;i<=n;i++) calc(i); cout<<ans<<endl; } }