2016 Team Training #21 Gym 100952 A D E F J

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 感觉用分解多变形然后用半平面交就行(如果试出来会更新)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值