A 水题
题意:两个人的时间分别是时,分,秒输入,也就是让我们输出谁时间最早呗。
思路:没有思路直接上,看手速了(我敲代码速度慢-_-!!!)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
int main()
{
int t,h1,m1,s1,h2,m2,s2;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d%d%d",&h1,&m1,&s1,&h2,&m2,&s2);
if(h1>h2)
printf("Player2\n");
else if(h1<h2)
printf("Player1\n");
else
{
if(m1>m2)
{
printf("Player2\n");
}
else if(m1<m2)
printf("Player1\n");
else
{
if(s1>s2)
printf("Player2\n");
else if(s1<s2)
printf("Player1\n");
else printf("Tie\n");
}
}
}
}
D 组合数学搞搞就行
题意:输入四个数N,M,K,D然后N个数取M个数,其中至少K个数要求大于等于D。
思路:直接将c[ans][k]*c[n-ans][m-k],c[ans][k+1]*c[n-ans][m-k-1]....全部加起来即可,注意处理结束就行了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const int M=1000000007;
int a[205];
LL c[205][205];
void test()
{
memset(c,0,sizeof(c));
for(int i=0;i<205;i++)
{
c[i][0]=1;
for(int j=1;j<=i;j++)
{
c[i][j]=(c[i-1][j-1]+c[i-1][j])%M;
}
}
}
int main()
{
int t,n,m,k,d;
scanf("%d",&t);
test();
while(t--)
{
scanf("%d%d%d%d",&n,&m,&k,&d);
int ans=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=d) ans++;
}
LL sum=0;
if(k>ans||n<m)
{
printf("0\n");continue;
}
for(int i=k;i<=ans;i++)
{
if(n-ans==0) break;
if(m-i<0) break;
sum=(sum+(c[ans][i]*c[n-ans][m-i])%M)%M;
}
if(n-ans==0) sum=c[ans][m];
printf("%lld\n",sum);
}
}
E dfs搜索
题意:矩阵n*m中放入t个数,给出n对数a,b,这n对数不能出现下面四种情况1.a在b的前面2.b在a的前面3.a在b的右边4.b在a的右边。
思路:看完题目,瞬间想到用dfs遍历找到所有情况,从第一个数开始一个一个往矩阵里放,放的时候处理条件即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int d[20][20],num[20][20];
int a,b,t,n,m,ans=0;
void dfs(int sum)
{
if(sum==t+1)
{
ans++;return;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(num[i][j]) continue;
int flag=0;
for(int k=0;k<4;k++)
{
int xx=dx[k]+i,yy=dy[k]+j;
if(d[sum][num[xx][yy]])
{
flag=1;break;
}
}
if(flag==0)
{
num[i][j]=sum;
dfs(sum+1);
num[i][j]=0;
}
}
}
}
int main()
{
int T,p;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&t);
scanf("%d",&p);
memset(num,0,sizeof(num));
memset(d,0,sizeof(d));
for(int i=0;i<p;i++)
{
scanf("%d%d",&a,&b);
d[a][b]=d[b][a]=1;
}
ans=0;
dfs(1);
if(ans==0) printf("impossible\n");
else printf("%d\n",ans);
}
}
F STL字符串处理(感觉就是,还没过,之后会更新)
J 感觉用分解多变形然后用半平面交就行(如果试出来会更新)