zoukankan      html  css  js  c++  java
  • 2013.5.A

    题1 高低位交换
    【问题描述】
        给出一个小于2^32的正整数。这个数可以用一个32位的二进制数表示(不足32位用0补足)。我们称这个二进制数的前16位为“高位”,后16位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。
        例如,数1314520用二进制表示为0000 0000 0001 0100 0000 1110 1101 1000(添加了11个前导0补足为32位),其中前16位为高位,即0000 0000 0001 0100;后16位为低位,即0000 1110 1101 1000。将它的高低位进行交换,我们得到了一个新的二进制数0000 1110 1101 1000 0000 0000 0001 0100。它即是十进制的249036820。
    
    【输入数据】
        读入一个小于2^32的正整数。
    
    【输出数据】
        新的数。
    
    【样例输入】
    1314520
    
    【样例输出】
    249036820
    
    T1:纯模拟
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int f[33],n,a[33],i=1;
    long long ans=1,sum=0;
    void exchange(int x){
    	int r;
    	while(x>0){
    	   r=x%2;
    	   x/=2;
    	   f[i]=r;
    	   i++;
    	}
    }
    void change(){
    	for(int x=1;x<=32;x++){
    	    
    		if(a[x]==1) sum+=ans;ans*=2;
    	}
    }
    int main(){
    	freopen("swap.in","r",stdin);
    	freopen("swap.out","w",stdout);
    	memset(f,0,sizeof(f));
    	memset(a,0,sizeof(a));
    	scanf("%d",&n);
    	exchange(n);
    	for(int j=16;j>0;j--){
    		a[j]=f[j+16];
    		a[j+16]=f[j];
    	}
    	change();
    	printf("%lld",sum);
    	return 0;
    }
    
      T2:
    题2数列排序
    【问题描述】
        给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换?
    【输入格式】
        第一行,正整数n (n<=100,000)。
        以下若干行,一共n个数,用空格分隔开,表示数列{an},任意-231<ai<231。
    【输出格式】
        只有一行,包含一个数,表示最少的交换次数。
    【输入样例】
        8
        8 23 4 16 77 -5 53 100
    【输出样例】
        5
    
      写这一题收获还是不少的,首先依旧表示自己打的题太少了,这样类型的题目没有碰到过40都看不下去了....TAT..
    这是一题图论题,要找环
    就比如
    4
    3 7 6 1
    你sort一下,排好正确的顺序
    1 3 6 7
    发现,原序列的3应该和7交换,而7应该和1交换,1应该和3交换;
    那么就恭喜你找到了最少的交换次数,2次,这也就是说找环的次数就为最少交换的次数;
    ps:这里说一下自己年轻的地方:
    1.交换过得数记得mark
    2.刚开始超级年轻的这样记录每一个数正确的位置:
    d[a[i]]=i;
    之后崩溃掉了,喜闻乐见。
    一直忘了数组的序号是不能为负的,逗了....这里用自定义即可;
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int a[100010],d[100010],i;
    bool f[100010];
    long long ans=0,k=0;
    struct node
    {
    	int b,c;
    		bool operator <(const node & a)const{
    		return b<a.b;
    	}
    } B[100001];
    void find(int x){
    	int m=x;
    	if(B[i].b==a[x])
    		return;
    	else{
    		if(f[x]==true){
    		  x=d[x];
    		  f[m]=false;
    		  ans++;
    		  find(x);
           }}
           f[x]=false;
    }
    int main(){
    	freopen("seqsort.in","r",stdin);freopen("seqsort.out","w",stdout);
    	int n,t;
        scanf("%d",&n);
        memset(f,true,sizeof(f));
        for(i=1;i<=n;i++){
        	scanf("%d",&a[i]);
        	B[i].b=a[i];
            B[i].c=i;
        }
        sort(B+1,B+n+1);
        for(i=1;i<=n;i++){
        	d[B[i].c]=i;
        }
        for(i=1;i<=n;i++){
        	ans=0;
        	if(f[B[i].c]==true) find(i);
        	k+=ans;
        }
        printf("%d",k);
        fclose(stdin);fclose(stdout);
        return 0;
    }
    

      



    T3:
    题3 路标设置
    【问题描述】
    	B市和T市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的“空旷指数”。现在政府决定在公路上增设一些路标,使得公路的“空旷指数”最小。他们请求你设计一个程序计算能达到的最小值是多少。
    	请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。
    【输入格式】
    	第1行包括三个数L、N、K,分别表示公路的长度,原有路标的数量,以及最多可增设的路标数量。
    	第2行包括递增排列的N个整数,分别表示原有的N个路标的位置。路标的位置用距起点的距离表示,且一定位于区间[0,L]内。
    【输出格式】
         输出1行,包含一个整数,表示增设路标后能达到的最小“空旷指数”值。
    
    【输入样例】road.in
    	101 2 1
    	0 101
    【输出样例】road.out
    	51
    【样例说明】
    	公路原来只在起点和终点处有两个路标,现在允许新增一个路标,应该把新路标设在距起点50或51个单位距离处,这样能达到最小的空旷指数51。
    
    【数据规模与约定】
    	50%的数据中,2 ≤ N ≤100,0 ≤K ≤100
    	100%的数据中,2 ≤N ≤100000, 0 ≤K ≤100000
    	100%的数据中,0 < L ≤10000000
    
      二分答案即可...
    =-=还是很不熟练啊...
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[100001],l,n,k,d=0;
    int judge(int x){
    	int now=0;
    	for(int i=1;i<n;i++){
    		if(a[i]%x==0) now+=a[i]/x-1;
    	            else  now+=a[i]/x;
        }
        if(now<=k) return 1; else return 0;
    }
    int main(){
    	freopen("road.in","r",stdin);
    	freopen("road.out","w",stdout);
    	scanf("%d%d%d",&l,&n,&k);
    	scanf("%d",&a[1]);
    	for(int i=2;i<=n;i++){
    		scanf("%d",&a[i]);
    	} 
    	for(int i=1;i<n;i++) a[i]=a[i+1]-a[i];
    	int ll=1,r=l,t,mid;
    	while(ll!=r){
    		mid=(r+ll)>>1;
    		if(judge(mid)) r=mid;
    		         else  ll=mid+1;
        }
    	printf("%d",ll);
    	return 0;
    }
    
     T4树形DP,想之后单独附上
  • 相关阅读:
    jquery toggle(listenerOdd, listenerEven)
    struts quick start
    hdu 1518 Square (dfs)
    hdu 2544 最短路 (最短路径)
    hdu 1754 I Hate It (线段树)
    hdu 1856 More is better (并查集)
    hdu 1358 Period (KMP)
    hdu 2616 Kill the monster (DFS)
    hdu 2579 Dating with girls(2) (bfs)
    zoj 2110 Tempter of the Bone (dfs)
  • 原文地址:https://www.cnblogs.com/polebug/p/3736007.html
Copyright © 2011-2022 走看看