集训队日常训练20180513-DIV2

A.2176

给一个字符串s,问距离为D的字母对是否存在相同。

模拟

#include<bits/stdc++.h>
using namespace std;

int main()
{
    string s,b;
    while(cin>>s)
    {
        if(s[0]=='*')break;
        int flag=1;
        map<string,int>ma;
        for(int jump=1;jump<s.size();jump++)
        {
            ma.clear();
            for(int L=0;L+jump<s.size();L++)
            {
                b.clear();
                b+=s[L];
                b+=s[L+jump];
                if(ma[b]==0)ma[b]=1;
                else
                {
                    flag=0;
                    break;
                }
            }
            if(flag==0)break;
        }
        if(flag)cout<<s<<" is surprising.\n";
        else cout<<s<<" is NOT surprising.\n";
    }
    return 0;
}
A.cpp

B.4694

给两堆糖果,每次从多的那堆拿gcd(a,b)个糖果,lemon先拿,问最后俩人糖果数。

模拟

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    while(cin>>a>>b,a||b)
    {
        int le=0,yu=0,sum=1;
        while(a||b)
        {
            if(sum%2)le+=__gcd(a,b);
            else yu+=__gcd(a,b);
            if(a>b)a-=__gcd(a,b);
            else b-=__gcd(a,b);
            sum++;
            if(a==0||b==0)
            {
                if(sum%2)le+=a+b;
                else yu+=a+b;
                break;
            }
        }
        cout<<le<<" "<<yu<<endl;
    }
    return 0;
}
B.cpp

C.5259

给若干多项式和一个x,问多项式值最大和按值分组输出相同值最多的个数。

模拟

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll mul(ll a, ll b,int x)
{
    if(b == 0) return a;

    while(b--) a*= x;
    return a;
}
int main()
{
    int t; cin >> t;
    while(t--)
    {
        map<ll,int> mp;
        ll  n, x; cin >> n >> x;
        int maxx = -1;
        while(n--)
        {
            ll k,sum = 0; cin >> k;
            while(k--)
            {
                ll a, b; cin >> a >> b;
                sum += mul(a,b,x);
            }
            mp[sum]++;
            maxx = max(maxx,mp[sum]);
        }
        map<ll,int>::reverse_iterator it=mp.rbegin();
        cout << it->first << " " << maxx << endl;
    }
    return 0;
}
C.cpp

D.5265

给一个围棋谱,问黑棋还需要下在哪才能全围住白棋。

广搜

#include<bits/stdc++.h>
using namespace std;
char a[25][25];
int dtx[4]={0,0,1,-1};
int dty[4]={1,-1,0,0};
int check(int i,int j)
{
    for(int z=0;z<4;z++)
    { 
        int I=i+dtx[z],J=j+dty[z];
        if(I>=0&&I<19&&J>=0&&J<19)
        { 
            if(a[I][J]=='W')
            return 1;
        }
    }
    return 0;
}
int main()
{
    while(gets(a[0])!=NULL)
    {
        for(int i=1;i<19;i++)
            gets(a[i]);
        int sum=0;
        for(int i=0;i<19;i++)
            for(int j=0;j<19;j++)
            {
                if(a[i][j]=='.')
                    if(check(i,j))
                        cout<<i+1<<" "<<j+1<<endl,sum++;
            }  
        if(sum==0)cout<<"YuYu Wins!\n";           
    }
    return 0;
}
D.cpp

E.5260

给一个1-n的序列,问全排列连接起来第x个数字是几。

模拟

#include <bits/stdc++.h>
using namespace std;
int s[1000000];
int main()
{
    int n,x,a[7],b[7],i,z,s1,flag,s2,k;
    while(~scanf("%d%d",&n,&x))
    {
        s1=n;flag=0;s2=0;k=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&z);
            a[i]=b[i]=z;
        }
        sort(a+1,a+n+1);
        for(i=2;i<=n;i++)
            s1*=i;
        sort(a,a+n);
        do
        {
            for(i=1;i<=n;i++)
            {
                if(a[i]!=b[i]) break;
            }
            if(i>n) flag=1;
            if(!flag) s2++;
            for(i=1;i<=n;i++)
                s[k++]=a[i];
        }while(next_permutation(a+1,a+n+1));
        x+=s2*n;
        x%=s1;
        if(x!=0) x--;
        printf("%d\n",s[x]);
    }
    return 0;
}
E.cpp

F.4702

给币值为1,3,5,7,9,13的硬币的个数和糖果的价格g,问最少需要多少枚硬币组成g。

背包

#include<iostream>                                  
#include<stdio.h>                                   
#include<math.h>                                    
using namespace std;
int dp[5001];
const int LIM=1e9;
int main()                                          
{                                                   
    int w[6]={1,3,5,7,9,13};                           
    int v[6];                                          
    int t=0,g;                                         
    while(t!=7)                                        
    {                                                  
        int ans=0;
        t=0;
        for(int i=0;i<6;i++)
        {
            cin>>v[i];
            if(v[i]==0)t++;
        }
        cin>>g;
        if(g==0)
            if(t==6)
                break;
        for(int i=1;i<=g;i++)
            dp[i]=LIM;
        for(int i=0;i<6;i++)
            for(int j=1;j<=v[i];j++)
                for(int k=g;k>=w[i];k--)
                    dp[k]=min(dp[k-w[i]]+1,dp[k]);
        if(dp[g]==LIM)cout<<"impossible"<<endl;
        else cout<<dp[g]<<endl;
    }
    return 0;
}
F.cpp

G.3331

给一个2n*2n的网格图,以中心为原点画一个直径为2n-1的圆,问圆周线穿过了多少个格子。

思维

#include<bits/stdc++.h>
using namespace std;
int arr[1005];
int main()
{
    int n;
    arr[1]=4;
    for(int i=2;i<=1004;i++){
        arr[i]=arr[i-1]+8;
    }
    while(cin>>n&&n!=0){
        cout << arr[n] <<endl;
    }
    return 0;
}
G.cpp

H.4671

给n个数,求前M大并按小到大输出。

只需要记录前M个。

#include<bits/stdc++.h>
using namespace std;
int get() {
 int r=0;
 char c;
 while(c=getchar(),!(c>='0'&&c<='9'));
 r = c-'0';
 while(c=getchar(),c>='0'&&c<='9')
  r = (r*10)+c-'0';
 return r;
}
int main()
{
    int n,m,x,b[11],len=0;
    n=get();
    m=get();
    for(int i=1;i<=n;i++)
    {
        x=get();
        if(len<m)b[len++]=x;
        else 
            for(int j=0;j<m;j++)
                if(b[j]<x)
                    swap(b[j],x);
    }
    sort(b,b+m);
    for(int i=0;i<m;i++)
    {
        if(i!=0)printf(" ");
        printf("%d",b[i]);
    }
    putchar('\n');
    return 0;
}
H.cpp

I.4959

给n个数,问能否选若干数使和=k。

深搜

#include<bits/stdc++.h>
using namespace std;
int n,a[21],i,k;
bool dfs(int i,int sum)
{
    if(i==n)
    {
        if(sum==k)return 1;
        return 0;
    }
    if(dfs(i+1,sum))return 1;
    if(dfs(i+1,sum+a[i]))return 1;
    return 0;
}
int main()
{
    while(cin>>n>>k)
    {
        for(i=0;i<n;i++)cin>>a[i];
        if(dfs(0,0))printf("Yes\n");
        else printf("No\n");
    }
    return 0;
 }
I.cpp

J.4374

n个特工,密钥总量为k(编号为0到k-1),以及每个特工所带的m个密钥,求是否每3个特工的密钥都可以解密文件。

模拟

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int check(int a[])
{    for(int i=0;i<m;i++)
        if(a[i]==0)
        return 0;
        return 1;
}
int main()
{     
       while(cin>>n>>m>>k)
       {  vector<int> v[10];
         for(int i=0;i<n;i++)
           { int x;  
            for(int j=0;j<k;j++)
              {cin>>x;
              v[i].push_back(x);}
            } 
            int flag=1;
            for(int i=0;i<n;i++)
            { for(int j=i+1;j<n;j++)
                 {for(int z=j+1;z<n;z++)
                   { int a[11]={0};
                     for(int t=0;t<k;t++)
                        { a[v[i][t]]=1;
                        a[v[j][t]]=1;
                        a[v[z][t]]=1;
                         } 
                          if(!check(a))flag=0;
                   }
                }
            }
            if(flag)cout<<"YES\n";
            else cout<<"NO\n";
       }
}
J.cpp

猜你喜欢

转载自www.cnblogs.com/taozi1115402474/p/10851209.html