noip2012 普及组

T1 质因数分解 题目传送门

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
LL read(){
    LL ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
LL n;
LL find(LL n){
    int x=2;
    while(x<=n&&n%x) x++;
    return x;
}
int main()
{
    n=read();
    printf("%lld\n",n/find(n));
    return 0;
}

T2 寻宝 题目传送门

#include<cstdio>
#include<cstring>
int a[10005][105],k[10005][105],c[10005];
int main()
{
    int i,j,n,m,sum=0,go,ha,s;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
    for(j=0;j<=m-1;j++)
    {
        scanf("%d %d",&a[i][j],&k[i][j]);
        if(a[i][j]==1)
        c[i]++;
    }
    scanf("%d",&go);
    for(i=1;i<=n;i++)
    {
        sum=(sum+k[i][go])%20123;
        s=(k[i][go]-1)%c[i]+1;
        if(a[i][go]==1) ha=1;
        else ha=0;
        while(ha<s)
        {
            if(go==m-1) go=0;
            else go++;
            if(a[i][go]==1)
            ha++;
        }
    }
    printf("%d\n",sum);
    return 0;
}

T3 摆花题目传送门

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=1007,mod=1000007;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,m,f[M][M],w[M];
int main()
{
    n=read(); m=read();
    for(int i=1;i<=n;i++) w[i]=read();
    for(int i=0;i<=n;i++) f[i][0]=1;
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++){
         f[i][j]=f[i-1][j]+f[i][j-1];
         if(j-w[i]) f[i][j]-=f[i-1][j-w[i]-1];
         f[i][j]=(f[i][j]+mod)%mod;
     }
    printf("%d\n",f[n][m]);
    return 0;
}

T4 文化之旅 题目传送门

这道题还是有点需要说的 我写的是A* 先一波spaly预处理如果没有限制需要的路程

然后在有限制的跑一波dfs就好了

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=155,inf=0x3f3f3f3f;
int read(){
    LL ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,k,m,S,T,ans=inf,cnt;
int w[M],d[M][M],map[M][M],dis[M],q[M],vis[M],usd[M];
void spfa(){
    memset(dis,0x3f,sizeof(dis));
    int head=0,tail=1;
    q[0]=T; vis[T]=1; dis[T]=0;
    while(head!=tail){
        int x=q[head++]; vis[x]=0;if(head>M) head=0;
        for(int now=1;now<=n;now++){
            if(dis[now]>dis[x]+d[now][x]){
                dis[now]=dis[x]+d[now][x];
                if(!vis[now]){q[tail++]=now; vis[now]=1; if(tail>M) tail=0;}
            }
        }
    }
}
int check(int x){
    for(int i=1;i<=cnt;i++) if(map[w[x]][usd[i]]||usd[i]==w[x]) return 0;
    return 1;
}
void dfs(int x,int h){
    if(x==T){ans=min(ans,h); return ;}
    for(int now=1;now<=n;now++){
        if(vis[now]||h+dis[now]>=ans||!check(now)) continue;
        vis[now]=1;
        usd[++cnt]=w[now];
        dfs(now,h+d[x][now]);
        cnt--; vis[now]=0;
    }
}
int main()
{
    int x,y,v;
    memset(d,0x3f,sizeof(d));
    n=read(); k=read(); m=read();
    S=read(); T=read();
    for(int i=1;i<=n;i++) w[i]=read();
    for(int i=1;i<=k;i++)
     for(int j=1;j<=k;j++)
      map[i][j]=read();
    for(int i=1;i<=m;i++){
        x=read(); y=read(); v=read();
        if(!map[w[x]][w[y]]) d[y][x]=min(d[y][x],v);
        if(!map[w[y]][w[x]]) d[x][y]=min(d[x][y],v);
    }
    spfa();
    vis[S]=1; usd[++cnt]=w[S]; dfs(S,0);
    if(ans<inf) printf("%d\n",ans);
    else printf("-1\n");
    return 0;
} 

时间: 2024-10-23 19:37:35

noip2012 普及组的相关文章

NOIP2012普及组 (四年后的)解题报告 -SilverN

本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告成AC后,看到别人的解题报告说fl能过只是因为测试数据范围小. 好像主要有三种解法,fl,dij,dfs dfs暂时弃,dij写到现在还没完成,先把fl的放上来. 等攻下T4,再施工前面三道题 T4-Floyd: 读完数据以后,只要把文化不兼容的城市的路都堵上,就可以用floyd了 可怜我之前堵路无

[Noip2012普及组]摆花

Description 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆.通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号.为了在门口展出更多种花,规定第 i 种花不能超过 ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列.试编程计算,一共有多少种不同的摆花方案 Input 共 2 行.第一行包含两个正整数 n 和 m,中间用一个空格隔开.第二行有 n 个整数,每两个整数之间用一个空格隔开,依次表示 a1.a2.--a

Noip2012普及组

T2: 传说很遥远的藏宝楼顶层藏着诱人的宝藏.小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书.说明书的内容如下: 藏宝楼共有N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏.除了顶层外,藏宝楼另有N层,每层M个房间,这M个房间围成一圈并按逆时针方向依次编号为0,-,M-1.其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同.每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x个有楼梯的房间(假定该房间

NOIP2012普及组--质因数分解

分析:一遍遍循环,效率比较低,但可以通过减半和除偶来减少次数,但是依旧不是很理想,数论中有个定论是任意合数都可以由 几个质数乘的,但是目前还没想好怎么运用这个定论,所以将就一下. PS:这个数肯定是合数,因为1不是质数,所以不可能是1和本身. 1 #include <stdio.h> 2 int main() 3 { 4 int n,i; 5 int j,x=0; 6 scanf("%d",&n); 7 for(i=(n/2);i>2;i--) //因为质因数

NOIP2012普及组解题报告

by RtPYH ------------------------------------------------------------------------------------------------------------------ 前言:作者是一个蒟蒻,如果对本文有建议,欢迎提出!鄙人将虚心接受. --------------------------------------------------------------------------------------------

Noip2012 普及组 第三题 摆花

博主声明: 新手第一次写动规的题解,如果出现错误请各位大力的喷,但不要骂脏话,最好告诉我怎么改,谢谢~.~ !!! 摆花 (flower.cpp/c/pas) [问题描述] 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共 m 盆. 通过调查顾客的喜好,小明列出了顾客最喜欢的 n 种花,从 1 到 n 标号. 为了在门口展出更多种花,规定第 i 种花不能超过 ai 盆, 摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列. 试编程计算,一共有多少种不同的摆花方案

2017年8月14日套题记录 | 普及组

写在前面 今天登洛谷发现离Noip剩下88天了??(虽然看起有点久),然后觉得似乎水了一个暑假什么也没做(虽然学了点数据结构和一些奇奇Gaygay的东西),于是打开题库发现去年Long Happy的集训套题我似乎没有提交过,那就一天一套题,顺便码个题解+心得(雾? T2.传作业 题目描述 某十三同学一日上学迟到,此时已经开始上早自习了,所以他只好请同学帮忙把作业传到组长那里.由于刚开学不久,某十三同学还没来得及认识所有同学,所以传作业时只好找熟悉的同学.已知某十三与组长之间有N个他熟悉的同学,并

1143 纪念品分组 2007年NOIP全国联赛普及组

1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品,并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序

采药 2005年NOIP全国联赛普及组&amp;疯狂的采药

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大."