集训队日常训练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;i++)
        {
            if(ss(i)&&ss(n-i)) sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}

A.cpp

B.4607

给一个数能否被17整除。

同余。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    while(cin>>s,s!="0")
    {
        int su=0;
        for(int i=0; s[i]; i++)su=(su*10+s[i]-‘0‘)%17;
        cout<<(su?0:1)<<endl;
    }
}

B.cpp

C.4681

给一个4*4的方格图,一次移动,输出结果。

暴力模拟。

#include<bits/stdc++.h>
using namespace std;
int a[5][5];
void left_swap()
{
    for(int i=0;i<4;i++)
    for(int j=1;j<4;j++)
    {
        int k=j;
        while(k>=1&&a[i][k-1]==0)
        {
            swap(a[i][k],a[i][k-1]);
            k--;
        }
    }
}
void left()
{
    for(int i=0;i<4;i++)
    for(int j=0;j<3;j++)
    if(a[i][j]==a[i][j+1])
    {
        a[i][j]+=a[i][j+1];
        a[i][j+1]=0;
        left_swap();
    }
}
void right_swap()
{
    for(int i=0;i<4;i++)
    for(int j=2;j>=0;j--)
    {
        int k=j;
        while(k<=2&&a[i][k+1]==0)
        {
            swap(a[i][k],a[i][k+1]);
            k++;
        }
    }
}
void right()
{
    for(int i=0;i<4;i++)
    for(int j=3;j>=1;j--)
    if(a[i][j]==a[i][j-1])
    {
        a[i][j]+=a[i][j-1];
        a[i][j-1]=0;
        right_swap();
    }
}
void top_swap()
{
    for(int j=0;j<4;j++)
    for(int i=1;i<4;i++)
    {
        int k=i;
        while(k>=1&&a[k-1][j]==0)
        {
            swap(a[k][j],a[k-1][j]);
            k--;
        }
    }
}
void top()
{
    for(int j=0;j<4;j++)
    for(int i=0;i<3;i++)
    if(a[i+1][j]==a[i][j])
    {
        a[i][j]+=a[i+1][j];
        a[i+1][j]=0;
        top_swap();
    }
}
void buttom_swap()
{
    for(int j=0;j<4;j++)
    for(int i=2;i>=0;i--)
    {
        int k=i;
        while(k<=2&&a[k+1][j]==0)
        {
            swap(a[k][j],a[k+1][j]);
            k++;
        }
    }
}
void buttom()
{
    for(int j=0;j<4;j++)
    for(int i=3;i>=1;i--)
    if(a[i][j]==a[i-1][j])
    {
        a[i][j]+=a[i-1][j];
        a[i-1][j]=0;
        buttom_swap();
    }
}
int main()
{
    int n;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(int i=0;i<4;i++)
            for(int j=0;j<4;j++)
            cin>>a[i][j];
        if(n==0)
        {
            left_swap();
            left();
        }
        else if(n==1)
        {
            right_swap();
            right();
        }
        else if(n==2)
        {
            top_swap();
            top();
        }
        else if(n==3)
        {
            buttom_swap();
            buttom();
        }
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            if(j==0)cout<<a[i][j];
            else cout<<" "<<a[i][j];
            cout<<endl;
        }
    }
    return 0;
}

C.cpp

D.4682

n个部下,每个部下需要Bi分钟交待任务,让后Ji分钟后完成任务。确定一个顺序,使得最早完成任务。

贪心,按照Ji从大到小排序,然后求解。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct ydw{
    ll b,j;
}qu[1005];
bool cmp(ydw x,ydw y)
{
    if(x.j!=y.j)return x.j>y.j;
    return x.b>y.b;
}
int main()
{
    ll i,n,k;
    int kk=1;
    while(scanf("%I64d",&n),n!=0)
    {
        for(i=0;i<n;i++)
        {
            cin>>qu[i].b>>qu[i].j;
        }
        sort(qu,qu+n,cmp);
        ll s=0;
        for(i=0;i<n;i++)
        {
            s+=qu[i].b;
            for(k=0;k<i;k++)
            {
                qu[k].j-=qu[i].b;
            }
        }
        ll m=0;
        for(i=0;i<n;i++)m=max(m,qu[i].j);
        printf("Case %d: ",kk++);
        cout<<s+m<<endl;
    }
    return 0;
}

D.cpp

E.3476

给n个时间,问是否矛盾。

暴力。

#include<stdio.h>
int main(){
    int i,j,n,h,m,s,h1,m1,s1;
    while(scanf("%d",&n)!=EOF,n){
        int f=1,a[1441]={0};
        for(i=0;i<n;i++){
            scanf("%d:%d-%d:%d",&h,&m,&h1,&m1);
            s=h*60+m;s1=h1*60+m1;
            if(f){
                for(j=s;j<s1;j++){
                    if(a[j]){
                        f=0;break;
                    }
                    a[j]=1;
                }
            }
        }
        if(f)printf("no conflict\n");
        else printf("conflict\n");
    }
}

E.cpp

F.4499

给一串AB串,操作1选1个位子把A改成B,B改成A,操作2选1个k,改变[1,k]的值。

思维,倒着来看。

如果s[i]=‘B‘那么需要改,如果修改长度>=2那么肯定选操作2,否则选操作1。

#include<cstdio>
int n,g,i,j;
char ch;
bool s[1000005],k;
int main()
{
    scanf("%d\n",&n);
    while(i<=n)
    {
        s[++i]=(ch=getchar())==‘A‘?1:0;
    }
    i--;
    while(i>=1)
    {
        if(k^s[i])i--;
        else
        {
            j=-1;
            while(!(k^s[i]))i--,j++;
            if(j)k^=1;
            g++;
        }
    }
    printf("%d",g);
}

F.cpp

G.3587

输出A,B的最大公约数。

欧几里得算法。

#include<stdio.h>
__int64 gcd(__int64 a,__int64 b){
    __int64 r=a%b;
    while(r){
        a=b;b=r;r=a%b;
    }
    return b;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        __int64 a,b;
        scanf("%I64d%I64d",&a,&b);
        printf("%I64d\n",gcd(a,b));
    }
    return 0;
}

G.cpp

H.3451

村庄之间已经有一些道路,你的工作就是修建一些道路,使所有村庄都连通起来,所有道路的长度都是最小的。

最小生成树,已经有的路权值为0。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAXN 100+5
#define MAXM 5000+5
int Map[MAXN][MAXN];
int F[MAXN];
int n,m,fx,fy,cnt;
struct edge
{
    int u;
    int v;
    int w;
}edges[MAXM];
bool cmp(edge a,edge b)
{
    return a.w<b.w;
}
int Find(int x)
{
    return F[x]==-1?x:F[x]=Find(F[x]);
}
int Kruskal()
{
    sort(edges,edges+m,cmp);
    int ans=0;
    for(int i=0;i<m;i++)
    {
        int u,v,w;
        u=edges[i].u;
        v=edges[i].v;
        w=edges[i].w;
        fx=Find(u);
        fy=Find(v);
        if(fx!=fy)
        {
            ans+=w;
            cnt++;
            F[fx]=fy;
        }
        if(cnt==n-1)break;
    }
    if(cnt<n-1)return -1;
    else return ans;
}
int main()
{
    scanf("%d",&n);
    m=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int w;
            scanf("%d",&w);
            if(i==j||i>j)continue;//多余的路径
            edges[m].u=i;
            edges[m].v=j;
            edges[m++].w=w;
        }
    }
    memset(F,-1,sizeof(F));
    int Q,a,b;
    scanf("%d",&Q);
    for(int i=0;i<Q;i++)
    {
        scanf("%d%d",&a,&b);
        fx=Find(a);
        fy=Find(b);
        if(fx!=fy)
        {
            F[fx]=fy;
            cnt++;
        }
    }
    int ans=Kruskal();
    printf("%d\n",ans);
    return 0;
}

H.cpp

I.3675

给三条边,问是否等边等腰斜角。

直接判一判就行。

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

#define ll __int64
int main()
{
    int T,ca=1;
    cin>>T;
    while(T--)
    {
        ll a[3];
        cin>>a[0]>>a[1]>>a[2];
        sort(a,a+3);
        cout<<"Case #"<<ca++<<": ";
        if(a[0]+a[1]<=a[2])cout<<"invalid!\n";
        else if(a[0]==a[1]&&a[1]==a[2])cout<<"equilateral\n";
        else if(a[0]==a[1]||a[1]==a[2])cout<<"isosceles\n";
        else cout<<"scalene\n";
    }
}

I.cpp

J.2913

[1,M]且可以整除a[i]的个数。

容斥,如果是奇数,那么个数ans+=m/lcm,如果是偶数,那么个数ans-=m/lcm,其中lcm为当前选中数的最小公倍数。

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

int main()
{
    int n,m,a[10];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<n;i++)scanf("%d",&a[i]);
        int ans=0;
        for(int i=1;i<(1<<n);i++)
        {
            int lcm=1,cnt=0;
            for(int j=0;j<n;j++)
                if(i&(1<<j))
                {
                    lcm=a[j]/__gcd(a[j],lcm)*lcm;
                    cnt++;
                }
            if(cnt&1)ans+=m/lcm;
            else ans-=m/lcm;
        }
        printf("%d\n",ans);
    }
    return 0;
}

J.cpp

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

时间: 2024-10-26 20:47:34

集训队日常训练20180525-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个数,表示每个水缸里的蝌蚪数

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

[日常训练]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 输出一行一个整数表示最大的总价