北邮暑假训练7解题报告

时间限制 1000 ms 内存限制 65536 KB

题目描述

亲爱的小朋友们,暑假过了之后,你们要二年级啦!现在老师要检测一下你们一年级学习的读数,大家准备好自己的程序了吗?来读数吧!

 

输入格式

input
输入第一行包括一个整数t,t<=10^5,接下来t行每行有一个整数Ai,Ai<10^17

 

输出格式

output
输出每个数字的中文读法,每组数据以回车结束。为了简单起见,用阿拉伯数字0-9代替汉字零到九,用S代替十,B代替百,Q代替千,W代替万,E代替亿

 

输入样例

4
10
1101000
21000
1010010000001000

输出样例

1S
1B1SW1Q
2W1Q
1Q01SW01BE1Q

hint
10要读作一十
这道题一开始就读错了题意,需要注意的三点,1 读字符串前置0 2 每四位中间0 3 四位全为0
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char cbuffer[200];
char sbuffer[80];
int pslen;
const char ch1[4]={0,'S','B','Q',};
const char chm[4]={0,'W','E','W'};
int main(){
    int t;scanf("%d",&t);
    while(t--){
        scanf("%s",cbuffer);
        int cs;
        int clen=strlen(cbuffer);
        if(clen==1){printf("%s\n",cbuffer);continue;}//to lazy to find cbuffer="0";
        for(cs=0;cs<clen-1;cs++){
            if(cbuffer[cs]!='0')break;
        }
        if(cs==clen-1){
            printf("%c\n",cbuffer[cs]);continue;
        }
        int m=(clen-cs-1)/4;
        pslen=0;
        int s=clen-1;
        bool fl=false;
        for(int i=0;i<=m;i++){
            if(chm[i]!=0&&i!=1){sbuffer[pslen++]=chm[i];}
            for(int indej=0;indej<4;indej++,s--){
                if(s<cs)break;
                if(cbuffer[s]!='0'){
                    if(i==1&&!fl){
                            sbuffer[pslen++]=chm[i];
                            fl=true;
                    }
                    if(ch1[indej]!=0)sbuffer[pslen++]=ch1[indej];
                    sbuffer[pslen++]=cbuffer[s];
                    if(indej!=3&&s-cs&&cbuffer[s-1]=='0'){
                        sbuffer[pslen++]='0';
                    }
                }
            }
            //if(cs>=clen)break;
        }
        sbuffer[pslen++]=0;
        for(int i=0;i<(pslen-1)/2;i++){
                swap(sbuffer[i],sbuffer[pslen-2-i]);
        }
        printf("%s\n",sbuffer);
    }
    return 0;
}

时间限制 1000 ms 内存限制 65536 KB

题目描述

现有正整数集A={i|i>0&&i<=n},求A的子集合B,使得对于任意x属于B,y属于B,x整除y或y整除x。优先考虑所含元素多的子集合,然后优先考虑所含元素和大的子集合,然后优先考虑字典序小的子集合。

输入格式

每组数据包含一行一个整数n(n<1e5).输入以EOF结束。

输出格式

每组数据输出一行,从小到大输出所求集合,注意行尾不要有空格。

输入样例

6
100

输出样例

1 3 6
1 3 6 12 24 48 96
水水水水水题
#include <iostream>
using namespace std;
int main(){
    int n;
    ios::sync_with_stdio(false);
    while(cin>>n){
        if(n<=1){cout<<n<<endl;continue;}
        for(int i=0;i<32;i++){
            if((1<<i)>n){
                int d=n>>(i-2);
                cout<<1;
                while(d<=n){
                    cout<<" "<<d;
                    d*=2;
                }
                cout<<endl;
                break;
            }
        }
    }
    return 0;
}


WTA
1 交错题目
2 忘记输入信息n<=1时continue;因为0会造成死循环
时间限制 1000 ms 内存限制 65536 KB

题目描述

有一个传说,对给定正整数 m 和 q,总有一个边长为 a,b,c 的三角形,是满足 a % m + b % m = c % m = q 的条件的三角形中周长最小的。
Mays 对此深信不疑,她打算和你一起探讨这个问题。她出了一些数据,请你帮忙求最小周长,如果找不到这样一个三角形,也请你告诉她这个惨痛的事实。

输入格式

给一个组数 T。接下来 T 组,每组两个数字 m 和 q ,(1 <= m <= 10^5 , 0 <= q < m)。

输出格式

输出当前组数和最小周长,格式见样例。若不存在满足的三角形,请把最小周长的数字替换成"Poor Mays!".

输入样例

2
3 2
3 2

输出样例

Case 1: 7
Case 2: 7
水水水水题
WWA: 1 概念还不清晰 2 枚举时随便枚举没有由小到大还试错了
#include <iostream>
using namespace std;
int main(){
    int t;
    ios::sync_with_stdio(false);
    cin>>t;
    for(int ti=1;ti<=t;ti++){
        int m,q;
        cin>>m>>q;
        if(q==0){cout<<"Case "<<ti<<": "<<3*m<<"\n";}
        else if(m<2*q){cout<<"Case "<<ti<<": "<<q*2+m<<endl;}
        else if(q>1)cout<<"Case "<<ti<<": "<<q*2+m*2<<endl;
        else cout<<"Case "<<ti<<": "<<q*2+4*m<<endl;
    }
    return 0;
}

时间限制 5000 ms 内存限制 65536 KB

题目描述

小叮当刚刚学会了传送门的使用方法,可是它不小心跌落到二维空间一个 n * m 的矩阵格子世界的入口(1,1)处,
他得知出口在(n,m)处,每穿越一个格子门,它的体力值会下降。
又饿又累的他 IQ 已经降为负数了,聪明的你,能帮他规划一下路线,使得它体力值下降的最少吗?
每一行有且仅有一个传送门,但是小叮当上课睡着了,只学会了用传送门瞬移到相邻行的另一个传送门且耗 1 滴体力。
此外,他就只能通过格子门走到相邻四个格子中的一个,也耗 1 滴体力。
ps,由于符合的路径太多了,你只需要告诉我们体力值消耗最小值。

 

输入格式

每组数据,第一行给 n,m 两个整数(2 <= n,m <= 10000),接下来一行,有 n 个数字,代表该行传送门的位置 x( 1 <= x <= m )。以 n,m 都为0结束。Mays温馨提醒:数据组数略大于100。

输出格式

对每组输入,输出一行,体力消耗最小值。

输入样例

5 5
5 4 3 2 1
0 0

输出样例

8
什么也不说
#include <cstdio>
using namespace std;
int m,n;
int dp[10001];
int x[10001];
int min(int a,int b){return a<b?a:b;}
int main(){
    while(scanf("%d%d",&n,&m)==2){
        if(n==m&&n==0)break;
        for(int i=1;i<=n;i++){
            scanf("%d",&x[i]);
        }
        dp[1]=x[1]-1;
        for(int i=2;i<=n;i++)dp[i]=min(dp[i-1]+1,i+x[i]-2);
        for(int i=n-1;i>0;i--)dp[i]=min(dp[i],dp[i+1]+1);
        int ans=0x7fffffff;
        for(int i=1;i<=n;i++){
            ans=min(ans,n-i+m-x[i]+dp[i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

时间限制 2000 ms 内存限制 65536 KB

题目描述

小弱最近在研究质数,他认为两个数互质是一个好性质。现在hiyot大神为了考考他学习的成果,给了他长度为n的整数序列a1、a2 .. an。同时给了他下面了两种操作:
操作一:"1 l r", 先求出区间[l, r]的所有数的gcd, 再计算[2,m]中有多少个数与gcd互质。
操作二: "2 p x", 把a[p]数值替换为x( 1 <= x <= 1000)
小弱是弱渣,但是如果你做出来了,他会认可你为大神,请你帮他算算。

输入格式

有多组数据。
每组数据以n( 1<=n<=10000), m(2<=m<=1000000), q(1<=q<=10000)开头。接下来一行有n(1 <= ai <= 1000)个数。最后q行每行有三个数,对应于一个操作。

输出格式

对每一个查询输出对应个数(如果区间gcd为1,则输出-1)。

输入样例

5 10 10
2 2 3 3 5
1 1 4
1 3 3
1 5 5
1 1 2
2 3 2
2 4 2
1 1 4
2 3 10
2 4 10
1 3 4

输出样例

-1
6 
7
4
4
3

posted @ 2014-07-31 00:38  雪溯  阅读(273)  评论(0编辑  收藏  举报