第10周

早上个人场

A - 礼尚往来 HDU - 4535
吉哥还是那个吉哥
  那个江湖人称“叽叽哥”的基哥
  
  每当节日来临,女友众多的叽叽哥总是能从全国各地的女友那里收到各种礼物。
  有礼物收到当然值得高兴,但回礼确是件麻烦的事!
  无论多麻烦,总不好意思收礼而不回礼,那也不是叽叽哥的风格。
  
  现在,即爱面子又抠门的叽叽哥想出了一个绝妙的好办法:他准备将各个女友送来的礼物合理分配,再回送不同女友,这样就不用再花钱买礼物了!
  
  假设叽叽哥的n个女友每人送他一个礼物(每个人送的礼物都不相同),现在他需要合理安排,再回送每个女友一份礼物,重点是,回送的礼物不能是这个女友之前送他的那个礼物,不然,叽叽哥可就摊上事了,摊上大事了…
  
现在,叽叽哥想知道总共有多少种满足条件的回送礼物方案呢?

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
ll f[105];
int main(void)
{
    f[2]=1;
    for(ll i=3;i<=100;i++){
        f[i]=(i-1)*(f[i-1]+f[i-2])%mod;//核心
        //cout<<f[i]<<endl;
    }
    int t;cin>>t;
    int a;
    while(t--){
        cin>>a;
        cout<<f[a]<<endl;
    }
    return 0;
}

C - 屌丝逆袭 HDU - 4500
毕业于普通本科的小Q一直自称是资深屌丝,不仅学校不知名,甚至他自己在这个普通学校也是默默无闻——直到临近毕业的时候,班里5朵金花中的2位甚至从没和他说过话!
  谁又能想到,如此不起眼的小Q在历经重重面试环节后,竟然如愿以偿加入了心仪已久的腾讯公司!消息刚刚传开的那几天,这在他们班甚至整个学院都是讨论的热门话题,如果这时候你还表示不知道小Q是谁,你都会被大家当作怪物的。
  正所谓野百合也有春天,屌丝也有逆袭的那一天!
  
  刚到腾讯大厦上班的那几天,小Q眼中的一切都是那么新鲜,连每天见到的前台MM在他眼中都胖的那么可爱。小Q就这样在紧张与兴奋的情绪中度过了一天又一天,每天即勤奋认真又小心翼翼,很希望能给主管留下个好印象,以免失去这来之不易的工作机会。
  一段时间以后,随着对工作环境以及同事的熟悉,小Q逐渐放松下来,在工作间隙,他细细观察了自己的工作环境,发现整个工作室是一个N行M列的矩形布局,或者是因为屌丝的本性逐步暴露,他还暗自给每个同事在心里进行了魅力值评分(为区别男女,男生一律用负整数表示,女生一律用正整数表示)。
  现在,小Q把所有人的数据记录下来,并且这样定义一个位置的价值:
  1、一个位置的价值只和其上下左右四个邻居的魅力值有关(对于靠边的位置,只考虑其存在的邻居);
  2、如果某位置的邻居和该位置主人性别不同,则总分加上邻居魅力值的绝对值,否则减去;
  3、对周围所有邻居的数据处理后,最终的得分即为这个位置的最终得分,得分越高,则该位置越好;

现在你能帮助小Q计算一下哪里才是最佳位置吗?

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
int a[25][25],b[25][25];
int main(void)
{
    int n,m;
    while(cin>>n>>m){
        if(n==0&&m==0) break;
        memset(a,0,sizeof a);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++) cin>>a[i][j];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++) {
                int num=0;
                if(a[i][j]<0){
                    num+=a[i+1][j];
                    num+=a[i-1][j];
                    num+=a[i][j+1];
                    num+=a[i][j-1];
                }
                else{
                    num-=a[i+1][j];
                    num-=a[i-1][j];
                    num-=a[i][j+1];
                    num-=a[i][j-1];
                }
                b[i][j]=num;
            }
        int a1=1,a2=1;
        int max1=-100000;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                if(b[i][j]>max1){
                    max1=b[i][j];
                    a1=i,a2=j;
                }
            }

        cout<<a1<<" "<<a2<<" "<<max1<<endl;
    }
    return 0;
}

E - 子串查询 HDU - 6345
度度熊的字符串课堂开始了!要以像度度熊一样的天才为目标,努力奋斗哦!

为了检验你是否具备不听课的资质,度度熊准备了一个只包含大写英文字母的字符串 A[1,n]=a1a2⋯an,接下来他会向你提出 q 个问题 (l,r),你需要回答字符串 A[l,r]=alal+1⋯ar 内有多少个非空子串是 A[l,r] 的所有非空子串中字典序最小的。这里的非空子串是字符串中由至少一个位置连续的字符组成的子序列,两个子串是不同的当且仅当这两个子串内容不完全相同或者出现在不同的位置。

记 |S| 为字符串 S 的长度,对于两个字符串 S 和 T ,定义 S 的字典序比 T 小,当且仅当存在非负整数 k(≤min(|S|,|T|)) 使得 S 的前 k 个字符与 T 的前 k 个字符对应相同,并且要么满足 |S|=k 且 |T|>k,要么满足 k<min(|S|,|T|) 且 S 的第 k+1 个字符比 T 的第 k+1 个字符小。例如 “AA” 的字典序比 “AAA” 小,“AB” 的字典序比 “BA” 小。

给出一个字符串和q个询问,对于每一个询问,输出l~r区间内最小字典序子序列的个数。

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
int a[100005][27];
int main(void)
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    for(int ii=1;ii<=t;ii++){
        int n,q;cin>>n>>q;
        string s;cin>>s;
        cout<<"Case #"<<ii<<":\n";
        memset(a,0,sizeof a);
        for(int i=0;i<n;i++){
            for(int j=1;j<=26;j++) a[i+1][j]=a[i][j];
            a[i+1][s[i]-'A'+1]++;
        }
        while(q--){
            int l,r;cin>>l>>r;
            if(l==r){
                cout<<1<<endl;
            }
            else
                for(int i=1;i<=26;i++){
                    if(a[r][i]-a[l-1][i]){
                        cout<<a[r][i]-a[l-1][i]<<endl;
                        break;
                    }
                }
        }
    }
    return 0;
}

F - 赛题分析 HDU - 6292
著名出题人小Q每次比赛后都会写一份《赛题分析》,包含比赛概况、每题的参考算法以及一些统计数值。

对于一道题来说,小Q会统计最短的验题人代码长度(Shortest judge solution)以及赛内参赛队伍最短的AC代码长度(Shortest team solution)。

统计验题人代码长度比较容易,因为验题人最多也不会超过20个。但是统计选手代码长度就不容易了,因为大赛区动辄三四百支队伍。

请写一个程序,帮助小Q统计最短代码长度。

就是模拟了,找最小

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
//int a[25],b[505];
int main(void)
{
    int t;cin>>t;
    int n,m;
    for(int i=1;i<=t;i++){
        cin>>n>>m;
        int temp=m;
        int k;
        int a1=200000,a2=200000;
        while(n--){
            cin>>k;
            a1=min(a1,k);
        }
        while(m--){
            cin>>k;
            a2=min(a2,k);
        }
        if(temp!=0)
        cout<<"Problem "<<1000+i<<":\nShortest judge solution: "
        <<a1<<" bytes.\nShortest team solution: "<<a2<<" bytes.\n";
        else
            cout<<"Problem "<<1000+i<<":\nShortest judge solution: "
        <<a1<<" bytes.\nShortest team solution: N/A bytes.\n";
    }
    return 0;
}

G - CCPC直播 HDU - 6297
在比特镇举行的中国大学生程序设计竞赛CCPC(China Collegiate Programming Contest)开始啦!这次比赛中加入了现场视频直播,而在直播屏幕的左下角,会显示评测队列。

比特镇的科技水平并不发达,直播分辨率并不高。准确地说,每个评测记录将被显示在1行38列的像素格上。一条评测记录由4个部分组成,从左往右依次为排名(3像素),队名(16像素),题号(4像素),评测情况(12像素)。相邻两个部分之间由1像素的分隔线|分开。其中,排名右对齐显示,队名左对齐显示,长度不足时用空格补齐。题号一定是4位正整数,因此恰好占据4像素。评测情况则比较复杂,它由两侧的括号[]以及中间10像素组成。

样例第一行表示排名第19的队伍qqqqq_University提交了题目1001,已经通过了30%的测试点,故左对齐显示3个X。

样例第二行表示排名第125的队伍quailty_U_2提交了题目1002,评测结果为WA,故居中显示WA,左边留4像素空格。

样例第三行需要居中显示TLE,左边同样留4像素空格。

样例第四行这支队伍是全场第一个通过1003的,故在AC后加上字符∗来特殊标注。

请写一个程序,对于每条评测记录产生直播信息。

曾经做过的一道题,也就是模拟。

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
using namespace std;

int main(void)
{
    int t;cin>>t;
    int a,c,e;
    string b,d;
    while(t--){
        cin>>a>>b>>c>>d;
        if(a<10) cout<<"  "<<a<<"|";
        else if(a<100) cout<<" "<<a<<"|";
        else cout<<a<<"|";
        cout<<b;
        for(int i=0;i<(16-b.length());i++) cout<<" ";
        cout<<"|"<<c<<"|[";
        if(d=="Running"){
                cin >> e;
            for(int i=0;i<e;i++) cout<<"X";
            for(int i=0;i<(10-e);i++) cout<<" ";
            cout<<"]\n";
        }
        else if(d=="WA") cout<<"    WA    ]\n";
        else if(d=="TLE") cout<<"    TLE   ]\n";
        else if(d=="FB") cout<<"    AC*   ]\n";
        else if(d=="AC") cout<<"    AC    ]\n";
        else if(d=="MLE") cout<<"    MLE   ]\n";
        else if(d=="RTE") cout<<"    RTE   ]\n";
        else if(d=="CE") cout<<"    CE    ]\n";
        else if(d=="OLE") cout<<"    OLE   ]\n";
        else if(d=="PE") cout<<"    PE    ]\n";
    }
    return 0;
}

H - 电梯爱情故事 HDU - 4505
  细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR。
  电梯其实是个很暧昧的地方,只有在电梯里,小Q才有勇气如此近距离接近女神,虽然觉得有点不自在,但次数多了,女神也习惯了小Q的存在,甚至熟悉到仿佛不说上句话自己也都觉得不合适了。可是,他们的谈话也仅仅限于今天天气不错啊或是你吃了吗之类的,往往在对方微笑点头后就再次陷入难堪的沉默之中。 于是,小Q便在陪伴女神的同时,也关注着电梯中显示的楼层数字,并且他注意到电梯每向上运行一层需要6秒钟,向下运行一层需要4秒钟,每开门一次需要5秒(如果有人到达才开门),并且每下一个人需要加1秒。
  特别指出,电梯最开始在0层,并且最后必须再回到0层才算一趟任务结束。假设在开始的时候已知电梯内的每个人要去的楼层,你能计算出完成本趟任务需要的总时间吗?
这是个很简单的问题,要知道,小Q已经修炼到快速心算出结果的境界,现在你来编程试试吧!

小学数学吧。

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
int a[105];
int main(void)
{
    int c;cin>>c;
    int n;
    while(c--){
        memset(a,0,sizeof a);
        cin>>n;
        int num=0,max1=0;
        int k;
        for(int i=0;i<n;i++){
            cin>>k;
            if(a[k]==0) num++,a[k]=1;
            max1=max(max1,k);
        }
        cout<<10*max1+num*5+n<<endl;
    }
    return 0;
}

下午团队场

A - Can you raed it croretcly? HDU - 6543
当你读题目的时候,你觉得奇怪吗?即使拼写错误,你也能正确理解单词的意思。
根据研究,如果单词的首字母和最后一个字母是正确的,并且只需交换其他字母,人类就可以自动更正单词的拼写。
现在,给你一个单词和正确的拼写,你能自动改正它吗?
就是判读两个字符串的首尾是不是相同的,然后看看字母个数相同不。

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;

int main(void)
{
    char a[20],b[20];
    int acnt[26] , bcnt[26] ;
    while(cin>>a>>b)
    {
        memset(acnt,0,sizeof(acnt)) ;
        memset(bcnt,0,sizeof(bcnt)) ;
        if(strcmp(a,b)==0)
            cout<<"Equal\n";
        else
        {
            if(a[0]==b[0]&&a[strlen(a)-1]==b[strlen(b)-1]&&strlen(a)==strlen(b)){
                for (int i = 1 ; i < strlen(a)-1  ; ++ i ){
                    ++ acnt[a[i]-'a'] ;
                    ++ bcnt[b[i]-'a'] ;
                }
                bool flag = true ;
               for (int i = 0 ; i < 26 ; ++ i ){
                if (acnt[i] != bcnt[i]){
                    flag = false ;
                    break ;
                }
               }
               if (flag)    cout <<"Yes" << endl ;
               else     cout <<"No" << endl ;
            }
            else
                cout<<"No\n";
        }
    }
    return 0;
}

B - Hello XTCPC HDU - 6536
一个字符串能不能按顺序拆成xtCpc,看看有几个

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
int a[5];//xtCpc
int main(void)
{
    int n;string s;
    while(cin>>n>>s){
            memset(a,0,sizeof a);
        for(int i=0;i<n;i++){
        if(s[i]=='x') a[0]++;

        if(s[i]=='t'&&a[0]>0){
            a[1]++;a[0]--;
        }
        if(s[i]=='C'&&a[1]>0){
            a[2]++;a[1]--;
        }
        if(s[i]=='p'&&a[2]>0){
            a[3]++;a[2]--;
        }
        if(s[i]=='c'&&a[3]>0){
            a[4]++;a[3]--;
        }
    }
    cout<<a[4]<<endl;
    }
    return 0;
}

C - SSY and JLBD HDU - 6542
麻将,好就好在题目友和一点,只要判断两种就可以了。英语差是一个弊病。

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
int a[4][10];
int d,n,x,b,z,fa,bai;
int main(void)
{
    string s;
    for(int i=0;i<14;i++){
        cin>>s;
        if(s[0]<='9'&&s[0]>='1'){
            if(s[1]=='w') a[1][s[0]-'0']++;
            if(s[1]=='s') a[2][s[0]-'0']++;
            if(s[1]=='p') a[3][s[0]-'0']++;
        }
        else{
            if(s=="dong") d++;
            if(s=="nan") n++;
            if(s=="xi") x++;
            if(s=="bei") b++;
            if(s=="zhong") z++;
            if(s=="fa") fa++;
            if(s=="bai") bai++;
        }
    }
    if(d&&n&&x&&b&&z&&fa&&bai&&
           a[1][1]&&a[1][9]&&a[2][1]&&a[2][9]&&a[3][1]&&a[3][9]){

            if(d>1||n>1||x>1||b>1||z>1||fa>1||bai>1||
           a[1][1]>1||a[1][9]>1||a[2][1]>1||a[2][9]>1||a[3][1]>1||a[3][9]>1)

            cout<<"shisanyao!"<<endl;
            else cout<<"I dont know!";
        }
        else{
            int temp=1;
            if(a[1][1]>2&&a[1][9]>2){
                temp=2;
                for(int i=2;i<=8;i++){
                    if(a[1][i]<1) temp=0;
                }
                if(temp){
                    for(int i=2;i<=8;i++){
                        if(a[2][i]) temp=0;
                    }
                    for(int i=2;i<=8;i++){
                        if(a[3][i]) temp=0;
                    }
                    if(d||n||x||b||z||fa||bai){
                        temp=0;
                    }
                }
            }
            else if(a[2][1]>2&&a[2][9]>2){
                 temp=2;
                for(int i=2;i<=8;i++){
                    if(a[2][i]<1) temp=0;
                }
                if(temp){
                    for(int i=2;i<=8;i++){
                        if(a[1][i]) temp=0;
                    }
                    for(int i=2;i<=8;i++){
                        if(a[3][i]) temp=0;
                    }
                    if(d||n||x||b||z||fa||bai){
                        temp=0;
                    }
                }
            }
            else if(a[3][1]>2&&a[3][9]>2){
                 temp=2;
                for(int i=2;i<=8;i++){
                    if(a[3][i]<1) temp=0;
                }
                if(temp){
                    for(int i=2;i<=8;i++){
                        if(a[2][i]) temp=0;
                    }
                    for(int i=2;i<=8;i++){
                        if(a[1][i]) temp=0;
                    }
                    if(d||n||x||b||z||fa||bai){
                        temp=0;
                    }
                }
            }

            if(temp==2) cout<<"jiulianbaodeng!";
            else cout<<"I dont know!";
        }
    return 0;
}

D - Build Tree HDU - 6533
把小的数放到前面,然后开始数学运算,数学太菜了。

#include<bits/stdc++.h>
#define MAX_INT  ((unsigned)(-1)>>1)
#define MIN_INT  (~MAX_INT)
#define pi 3.1415926535898
#define ll long long
#define mod 1000000007
using namespace std;
ll a[200005];
ll b[200005];
int main(void)
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//加速是个好东西
    ll k,m,n,p;
    while(cin>>k>>m>>n>>p){//m层,m-1层边,n叉树
        for(int i=1;i<=k;i++){
            cin>>a[i];
            b[i]=0;
        }
        sort(a+1,a+1+k);
        ll ans=0;
        ll max1=0;
        if(n==1) max1=m;
        else max1=(pow(n,m)-1)/(n-1);//等比数列的前m项和,max1-1就是要加几次
        for(int i=1;i<max1;i++){
			b[i]=(b[(i-1)/n]%p+a[i]%p)%p;//把每一次的和都给加到b数组上。
			ans=(ans+b[i])%p;
		}
        cout<<ans<<endl;
    }
    return 0;
}
/*
6 3 2 100
1 2 3 4 5 6
ans:27
*/

下午的团队赛打得不是很完美舒服,到后面一小时都是各看各的了,没有思维的碰撞。有点类似个人了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值