• 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,想之后单独附上
  • 相关阅读:
    自定义UITableViewCell
    使用NSOperation实现异步下载
    iOS中判断一个文件夹是否存在
    iphone下载进度条,显示下载字节数与百分比
    NSURLConnection下载文件并显示进度(HEAD)
    iphone 模拟器 显示 隐藏的资源库
    iOS使用NSURLConnection发送同步和异步HTTP Request
    NSFileManager和NSFileHandle(附:获取文件大小 )
    xcode4.2设立Created by &MyCompanyName_
    iphone开发之轻松搞定原生socket 编程,阻塞与非阻塞,收发自如
  • 原文地址:https://www.cnblogs.com/polebug/p/3736007.html
Copyright © 2020-2023  润新知