NOIP模拟10.31 R2

52 篇文章 0 订阅
49 篇文章 0 订阅

2016提高D2
A.组合数问题。AC
B.蚯蚓 水了60。
C.愤怒的小鸟。。写过了。。结果还是被卡了精度5分。
UPD:B的正解。。。其实很简单。。。只需要发现一个性质:如果我们维护三个队列,分别表示原长度,切开后较短部分的长度,切开较长部分的长度。首先我们把原长度都从大到小排序,然后扔进q1,我们发现如果x1>x2,记x1被切成a1和b1,x2被切成a2和b2,(a>b)那么a1>a2,b1>b2.也就是说我们只要模拟去做,每次把切出来的两部分新的分别用两个队列来维护,那么这两个队列就一定是分别有序的。因此三个队列中队首一定都是最大的,我们只需每次比较三个队列的队首元素即可。

A

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 2010
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int t,k,n,m,c[N][N],ans[N][N];
int main(){
//  freopen("a1.in","r",stdin);
    t=read();k=read();for(int i=0;i<=2000;++i) c[i][0]=1;
    for(int i=1;i<=2000;++i)
        for(int j=1;j<=i;++j)
            c[i][j]=(c[i-1][j]+c[i-1][j-1])%k;
    for(int i=1;i<=2000;++i)
        for(int j=1;j<=2000;++j){
            if(j<=i&&!c[i][j]) ans[i][j]++;
            ans[i][j]+=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1];
        }
    while(t--){
        n=read();m=read();
        printf("%d\n",ans[n][m]);
    }return 0;
}

B

60分版

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 7000010
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,ad,u,v,t;
ll ans[N];
double p;
priority_queue<ll>q;
int main(){
//  freopen("b.in","r",stdin);
    n=read();m=read();ad=read();u=read();v=read();t=read();p=u*1.0/v;
    for(int i=1;i<=n;++i) q.push(read());
    for(int id=1;id<=m;++id){
        int x=q.top()+ad*(id-1);q.pop();
        ans[id]=x;int y=x*p;q.push(y-ad*id);q.push(x-y-ad*id);
    }for(int i=t;i<=m;i+=t) printf("%lld ",ans[i]);puts("");
    for(int i=1;i<=n+m;++i){
        if(i%t==0) printf("%lld ",q.top()+ad*m);q.pop();
    }puts("");
    return 0;
}

100分版

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 7000010
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,ad,u,v,t,h1=1,q1[N],q2[N],q3[N],h2=1,h3=1,t1=0,t2=0,t3=0;
ll ans[N];
inline bool cmp(int x,int y){return x>y;}
int main(){
//  freopen("b.in","r",stdin);
    n=read();m=read();ad=read();u=read();v=read();t=read();
    for(int i=1;i<=n;++i) q1[i]=read();sort(q1+1,q1+n+1,cmp);t1=n;
    for(int i=1;i<=m;++i){
        ll x1=0,x2=0,x3=0,x=0;
        if(h1<=t1) x1=q1[h1]+ad*(i-1);
        if(h2<=t2) x2=q2[h2]+ad*(i-1);
        if(h3<=t3) x3=q3[h3]+ad*(i-1);
        if(x1>=x2&&x1>=x3) h1++,x=x1;
        else if(x2>=x3) h2++,x=x2;
        else h3++,x=x3;ans[i]=x;ll y=x*u/v;
        q2[++t2]=y-ad*i;q3[++t3]=x-y-ad*i;
    }for(int i=t;i<=m;i+=t) printf("%lld ",ans[i]);puts("");
    for(int i=1;i<=n+m;++i){
        ll x1=0,x2=0,x3=0,x=0;
        if(h1<=t1) x1=q1[h1]+ad*m;
        if(h2<=t2) x2=q2[h2]+ad*m;
        if(h3<=t3) x3=q3[h3]+ad*m;
        if(x1>=x2&&x1>=x3) h1++,x=x1;
        else if(x2>=x3) h2++,x=x2;
        else h3++,x=x3;
        if(i%t==0) printf("%lld ",x);
    }puts("");
    return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 300000
#define eps 1e-7
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int tst,n,m,b[20][20],bin[20],dp[N];
struct data{
    double x,y;
}p[20];
inline bool cmp(data x,data y){return x.x<y.x;}
int main(){
//  freopen("c.in","r",stdin);
    tst=read();bin[0]=1;
    for(int i=1;i<=18;++i) bin[i]=bin[i-1]<<1;
    while(tst--){
        n=read();m=read();memset(dp,inf,sizeof(dp));
        memset(b,0,sizeof(b));dp[0]=0;
        for(int i=1;i<=n;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
        sort(p+1,p+n+1,cmp);
        for(int i=1;i<=n;++i)
            for(int j=i+1;j<=n;++j){
                if(abs(p[j].x-p[i].x)<=eps) continue;
                double A=(p[i].y*p[j].x-p[j].y*p[i].x)/(p[i].x*p[j].x*(p[i].x-p[j].x));
                if(A>=-eps) continue;b[i][j]=bin[i-1]|bin[j-1];
                double B=p[i].y/p[i].x-A*p[i].x;
                for(int k=j+1;k<=n;++k)
                    if(abs(A*p[k].x*p[k].x+B*p[k].x-p[k].y)<=eps) b[i][j]|=bin[k-1];
            }
        for(int s=0;s<bin[n]-1;++s)
            for(int i=1;i<=n;++i){
                if(s&bin[i-1]) continue;
                dp[s|bin[i-1]]=min(dp[s|bin[i-1]],dp[s]+1);
                for(int j=i+1;j<=n;++j){
                    if((s&bin[j-1])||(!b[i][j])) continue;
                    dp[s|b[i][j]]=min(dp[s|b[i][j]],dp[s]+1);
                }break;
            }printf("%d\n",dp[bin[n]-1]);
    }return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NOIP(全国青少年信息学奥林匹克竞赛)是中国国内最高水平的信息学竞赛之一,是计算机领域的重要赛事。针对NOIP模拟题,通常是为了帮助参赛者熟悉比赛形式和题型,提供足够的训练机会。 数据下载是NOIP比赛中的一个重要环节,因为参赛者需要根据提供的数据集进行程序开发和测试。数据下载一般通过网络进行,参赛者需要在指定的时间段内下载数据集到自己的计算机上。 在进行NOIP模拟题数据下载时,我们可以按照以下骤进行操作: 1. 确认下载链接:NOIP官方会提供下载数据集的链接或者FTP地址,参赛者需要确认链接是否可用和正确。 2. 选择下载工具:根据自己的需求,参赛者可以选择合适的下载工具进行操作。常见的下载工具有浏览器内置下载工具、迅雷、IDM等,可以根据个人的习惯和需求选择合适的下载工具。 3. 打开下载工具:根据所选择的下载工具类型,打开对应的软件,进入下载界面。 4. 输入下载链接:将NOIP提供的数据集下载链接复制粘贴到下载工具的链接输入框中,点击确定或开始进行下载。 5. 等待下载完成:根据数据集的大小和网络速度不同,下载时间会有所变化。参赛者需要耐心等待下载完成,确保数据集完整地保存到自己的计算机上。 6. 验证数据完整性:下载完成后,参赛者需要验证数据集的完整性,确保所有文件都成功地保存到指定位置。可以进行文件大小的比对或者逐个文件的校验来检查数据完整性。 通过以上骤,参赛者可以成功地进行NOIP模拟题数据的下载。在实际比赛中,一个高效的数据下载过程可以提高参赛者的准备时间和竞争力,确保能够充分利用所提供的数据集进行开发和测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值