• 2013.4.A


    =-=最近简直忙疯了.....两眼泪汪汪的...一个星期又磨磨蹭蹭的刷了一套

    1.java_c

    题1  Java vs C++
    【问题描述】
        Java和C++两种语言的辩手都可以相互争论数小时去证明他们的编程语言是最好的。用Java的人将告诉人们,他们的程序更加清楚且不容易犯错,而用C++的人会嘲笑他们没有能举出有代表性的实例来证明他们的观点,或者告诉他们Java的程序运行速度慢而且源代码太长。
        另一个问题是,用Java和C++的人永远无法在标识符的命名上取得共识。在Java中,由多个单词组成的标识符的命名规则如下:第一个单词是以小写字母开头,接下来的每一个单词以大写字母开头,分隔符是不允许使用的。其他所有的字母都是小写的。下面举出一些例子:javaIdentifier,longAndMnemonicIdentifier,name,nEERC。
        而在C++中,人们只用小写字母来命名标识符。他们运用下划线“_”来分隔单词。下面举出一些例子:c_identifier,long_and_mnemonic_identifier,name(当只有1个单词时,用Java和C++的人是统一的),n_e_e_r_c。
        你需要写一个程序来相互翻译Java和C++的程序。当然了,翻译后的标识符必须符合它的命名规则,否则人们不会认同你的翻译。
        给你一个标识符,它可能会是Java或者C++标识符中的一种,而你需要将其翻译成另一种。如果这个标识符既不是Java标识符也不是C++标识符,你的程序需要报告错误。翻译必须符合规范,所以就需要改变字母大小写或者添加、删除下划线。
    【输入格式】
        输入文件1行,包含一个标识符。标识符由大小写字母和下划线组成,长度不会超过100。
    【输出格式】
        如果输入的是Java标识符,输出应该为C++标识符;反之亦然。如果输入既不是Java标识符,也不是C++标识符,则输出“Error!”。
    【输入样例1】
        long_and_mnemonic_identifier
    【输出样例1】
        longAndMnemonicIdentifier
    
    【输入样例2】
        anotherExample
    【输出样例2】
        another_example
    
    【输入样例3】
        i
    【输出样例3】
        i
    
    【输入样例4】
        bad_Style
    【输出样例4】
    Error!
    

      java_c 这一题主要是考字符串的处理,写的时候还是要很细心的,首先是c++要手打insert.delete,表示很忧伤;一些小细节要考虑到,就比如首字母如果是大写或是_,输出error

      代码

    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s[200];
    bool f[3];
    int i,j,l;
    int main(){
    	freopen("java_c.in","r",stdin);
    	freopen("java_c.out","w",stdout);
    	memset(f,false,sizeof(f));
    	scanf("%s",s);
    	l=strlen(s);
    	for(i=0;i<l;i++){
    		if(s[0]>=65 && s[0]<97){
    			f[1]=true;f[2]=true;
    			break;
    		}
    		if(s[0]=='_'){
    			f[1]=true;f[2]=true;
    			break;
    		}
    		if(s[i]>=65 && s[i]<97 && s[i]!=95){
    			l++;
    			f[2]=true;
    			for(j=l;j>i;j--) s[j]=s[j-1];
    			s[i+1]=s[i]+32;
    			s[i]='_';
    			i++;
    		   }
    		if(s[i]=='_'){
    			f[1]=true;
    			if(s[i+1]>=97){
    				for(j=i;j<l-1;j++) s[j]=s[j+1];
    			    s[i]=s[i]-32;
    			    l--;
    			 }
    	        else{
    			   f[2]=true;
    			   break;
    	    }}}
    	if(f[1] && f[2]) printf("Error!");
    	   else for(i=0;i<l;i++) printf("%c",s[i]);
    	   
    	return 0;
    }
    

      2.calculate

    题2  计算概率
    【问题描述】
        小明有n个长度不一的小木棍,这些木棍的长度都是正整数。小明的父亲想和小明做一个游戏。他规定一个整数长度l,让小明闭着眼睛从n个木棍中随便拿出两个。如果两个木棍的长度总和小于等于l,则小明胜,否则小明的父亲胜。小明想知道他胜出的概率究竟有多大。
    【输入说明】
        输入包含两行。第一行为两个整数n和l,其中n和l都不超过100000。第二行包含n个整数,分别为n个木棍的长度。
    【输出说明】
        输出包含一个实数,小明胜出的概率,保留两位小数。
    【输入样例】calculate.in
        4 5
        1 2 3 4
    【输出样例】calculate.out
        0.67
    

      一开始打了个暴力,居然骗了个80,surprise!

          之后看了题解说是要用dp.....但是看了某个大神的代码之后,发现可以用排列组合轻松搞定!!

         

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    long long a[1000001],k,ans=0,n,l;
    int main(){
    	//freopen("calculate.in","r",stdin);freopen("calculate.out","w",stdout);
    	scanf("%d%d",&n,&l);
    	for(int i=0;i<n;i++){
    		scanf("%d",&k);
    		a[k]++;
    	}
        int h=1,r=l-1,s=0;
        while(r>=h){
        	s+=a[h];
        	ans+=a[r]*s;
        	r--;
        	h++;
        }
        if(h==r) s+=a[h];
        ans+=s*(s-1)/2;
        n=n*(n-1)/2;
        printf("%.2f",(double)ans/n);
        return 0;
    }
    

      3.recruitment

    题3  袁绍的刁难
    
    【问题描述】
      黄巾之乱后,郭嘉到了袁绍的统辖地区,袁绍想给郭嘉一个下马威,当时正值他招募将领的时候,于是乎,袁绍就让郭嘉去替他招募将领。
      这时候有很多很多的将领到袁绍处报到(别人家底厚,四世三公哪~~),每个将领的编号依次为1、2、3、……,第i个将领的武力值为3^(i-1)。
      袁绍需要我们的郭嘉招纳任意个将领,而郭嘉选中的将领有一个“总武力值”为各个将领的武力值之和。例如:郭嘉这一次招募了第一个将领和第三个将领,那么“总武力值”为1+9=10。
      袁绍想知道,他可以获得的第k小的“总武力值”是多少,请你帮助我们的郭嘉告诉袁绍这个第k小的“总武力值”。
      从文件中读入k,输出郭嘉能够获得的,第k小的“总武力值”。
    
    【输入格式】
      输入文件的第一行为n(n≤100),表示测试数据的组数。
      以下n行,每行为一个k值。
    
    【输出格式】
      输出包含n行,每行输出一个对应的结果。 
    
    【输入样例】
      1
      7
    
    【输出样例】
      13
    
    【样例说明】
      郭嘉能够拿到的总武力值从小到大为1、3、4、9、10、12、13……所以第7小的总武力值是13。
      对于50%的输入文件,有k≤5000。
    对于100%的输入文件,有k≤2^31-1。
    
      表示打这一题打得无限忧伤,首先是一个周末都没有时候调它就很不开森了,没想到还因为最后输出的没有开lld,无限wa得我飙泪
    咳咳.....一开始看到这一题的时候真是一点想法都没有,之前貌似没有打过这样的题目,之后40表示可以用进制转化,但之后发现用2进制并不需要倒着输出,想想2就可以知道了
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int i=0;
    long long f[100000];
    void exchange(int x){
    	int r;
    	while(x>0){
    	   r=x%2;
    	   x/=2;
    	   f[i]=r;
    	   i++;
    	}
    }
    int main(){
    	freopen("recruitment.in","r",stdin);freopen("recruitment.out","w",stdout);
    	long long k,sum,ans;
    	long long n;
    
    	scanf("%d",&n);
    	for(int j=0;j<n;j++){
    		memset(f,0,sizeof(f));
    		sum=0;ans=1;i=0;
    		scanf("%d",&k);
    	    exchange(k);
    		for(int l=0;l<=i;l++){
    			
    			if(f[l]==1){
    				sum+=ans;
    			
    			}ans*=3;
    		}
    		printf("%lld
    ",sum);    	
    	}
    	return 0;
    }
    

      

     
  • 相关阅读:
    【摄影】延时摄影
    【sas sql proc】统计
    【分析模板】excel or sas
    JavaScript的方法和技巧
    好书推荐
    七招制胜ASP.NET应用程序开发
    .Net中使用带返回值的存储过程(VB代码)
    ASP.NET 2.0构建动态导航的Web应用程序(TreeView和Menu )
    简单查询和联合查询两方面介绍SQL查询语句
    数字金额大小写转换之存储过程
  • 原文地址:https://www.cnblogs.com/polebug/p/3718471.html
Copyright © 2020-2023  润新知