集训队日常训练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

原文地址:https://www.cnblogs.com/taozi1115402474/p/10851209.html

时间: 2024-10-25 09:55:45

集训队日常训练20180513-DIV2的相关文章

集训队日常训练20181117 DIV2

大佬们一顿操作猛如虎,拼命AC强啊 4262: 区间异或  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 139            Accepted:58 Description zzd通过艰苦的学习,终于领悟了异或(^)的计算方法. 可是现在他面前出现了一道难题,zzd陷入了迷茫之中…你能帮帮他么? 给出一个长为N的序列{A1, A2, A3, ... , An}.求解区间[L,

集训队日常训练20181201 E 1005 : 小蝌蚪

时间限制(普通/Java):500MS/1500MS     内存限制:65536KByte总提交: 25            测试通过:5 描述 有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限蝌蚪的袋子,可以往一个水缸里放入一只蝌蚪,也可以取出一只蝌蚪,求最少的操作数,使得每个水缸的蝌蚪数量形成一个公差为 k 等差数列. 输入 多组数据(<35),每组数据描述如下. 第一行一个数 n,k(1<=n<=105,0<=k=<104).第二行 n个数,表示每个水缸里的蝌蚪数

集训队日常训练20180525-DIV2

A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { int i=2,a=sqrt(n); for(;i<=a;i++) if(n%i==0) return 0; return 1; } int main() { int n; while(scanf("%d",&n),n) { int sum=0; for(int i=2;i<=n/2;

[日常训练]yayamao的神题

Description $yayamao$是数学神犇,一天他在纸上计算起了$1/P$, 我们知道按照模拟除法可以得到准确解,例如$1/7=0.(142857),1/10=0.1(0)$.$yayamao$发现无论他如何模拟小数都会出现循环,现在$yayamao$想知道循环的长度以及循环出现之前,小数点后面的未循环的数字的位数.例如$1/15=0.0(6)$,那么它的循环长度为$1$,小数点后面的未循环的数字的位数为$1$;$1/4=0.25(0)$,那么它的循环长度为$1$,小数点后面的未循环的

[日常训练]最大M子段和

Description 在长度为的序列中选出段互不相交的子段,求最大字段和. Input 第一行两个整数. 第二行个整数. Output 一行一个整数表示最大值. Sample Input 5 2 10 -1 10 -1 10 Sample Output 29 HINT Solution 如果序列中正整数个数,直接取最大的个数的和即可. 将序列合并成若干个交错的正负段和,如-1,-2,3,4,-5,-6可以合并成-1-2,3+4,-5-6. 记录所有正数段之和,设正数段个数为,则需要把k段正数段

[日常训练]curves

Description 小同学的弟弟小昨天学习了数学中的一元二次函数,但是由于学业不精,他一个晚上都在缠着小问一元二次函数的极值问题,小烦不可耐,于是,想请你帮忙弄个程序来应付小.程序要完成以下任务: 给你个二次函数,记第个为:. 设函数. 请你求出的在区间上的最小值,结果保留位有效数字. Input 输入文件第一行是一个整数. 接下来行,每行个实数,之间有一个空格分隔. Output 输出一行一个实数,表示的在区间上的最小值. Sample Input 2 3 --2 1 2 -4 2 Sam

[日常训练]大灾难

Description 在一个生态圈中,食物链的维系是很重要的.食物链的断裂往往引起连锁反应,进而招致生态系统如同多米诺骨牌一样坍塌. 现在考虑一个简化模型.在一个生态系统中,有$N$种生物,它们分为两类:生产者与消费者.生产者通过这个系统之外的能量来生存,最常见的是植物的光合作用.而消费者需要"消费",也就是以其他生物为食物才可以生存.为了简化问题,我们假设所有消费者是可以分层的,高一层的消费者可能的食物来源都来自它的严格下层.生产者可以视为最下层的成员.当一种生物灭绝之后,依赖于它

[日常训练]变戏法

Description 一开始有$n$个只有颜色不同的小球.定义使用一次膜法的效果是重新排列第$l_i$个到第$r_i$个小球.给定了$n$个小球的初始状态和最终状态,以及$m$次膜法的范围$l_i,r_i$.判断是否可以从初始状态转移到最终状态. Input 第一行有一个整数$t$表示数据组数. 每组数据中, 第一行两个整数$n,m$,表示总共有$n$个小球,$m$次操作. 第二行$n$个整数$a_i$,表示初始状态. 第三行$n$个整数$b_i$,表示最终状态. 接下来$m$行,每行两个整数

[日常训练]training

Description 一条线上有栋楼,第栋楼有层,每层有1个价值为的物品. 可以花费1个单位时间完成以下3种移动: 1.在同一栋楼中向上或者向下走一层; 2.如果此刻在顶楼,可以通往1楼; 3.从当前楼移动到相邻楼的同层.如果相邻楼没有当前位置高,则会落到相邻楼的顶层. 初始时在第一栋楼的顶层,单位时间可以移动,拿去物品不需要时间,且一个物品被拿一次之后就会消失. 求能获得的最大的总价值. Input 第一行两个正整数. 以下行每行两个整数表示和. Output 输出一行一个整数表示最大的总价