ACdream 1038 (想法+排序)
来源:互联网 发布:西安高新区软件公寓 编辑:程序博客网 时间:2024/04/28 14:15
题目:ACdream 1038 (想法+排序)
地址:http://www.acdream.net/problem.php?cid=1014&pid=0
思路:
1. 这一题的题意是将打乱了的数字归于原位,每一次交换2个数字的位置,如果有k个交换机会,最多有几个数字归于原位。
2. 这一题你会发现无论数字怎样打乱都会形成一个一个的环,假设由n个数字组成一个环,那么只需要交换n-1次即可将所有的位置还原,如果不足n-1次的交换机会,那么你至少可是使k个数字还原。
3. 由于题目是k次使最多的数字归位,那么在事先统计出了各个环的数量后,就排序,先解决小环,再解决大环,就这样。
4. 那么这一题的流程就分为:输入->统计环数->将环数排序->从小到大解决->输出
#include<stdio.h>#include<stdlib.h>#include<string.h>#define Max 100001 int flag[Max], huan[Max], number[Max]; int cmp( const void *a, const void *b){ return *(int*)a - *(int*)b;} int main(){ int n,k; int result,temp; int i, nu,cicle; /*控制数组*/ while (scanf("%d%d",&n,&k)!=EOF) { result=0; memset(flag, 0, sizeof(flag)); memset(huan, 0, sizeof(huan)); memset(number, 0, sizeof(number)); for (i=0; i<n; i++) { scanf ("%d",&number[i]); if(i==number[i]) /*将已经归位原位的数字统计*/ { flag[i]=1; result++; } } nu=0; for( i=0; i<n ;i++) { cicle=0; /*统计环的大小,环的个数*/ temp=i; while (flag[temp]==0) { cicle++; flag[temp]=1; temp=number[temp]; } if(cicle>1) huan[nu++]=cicle; } qsort( huan, nu, sizeof (huan[0]), cmp); /*按照换的大小排序*/ for( i=0; i<nu ; i++) /*统计归位的数字*/ { if ( k<(huan[i]-1)) { result=result+k; break; } else { result+=huan[i]; k=k-(huan[i]-1); } } printf("%d\n",result); } return 0;}/************************************************************** Problem: 1038 Language: C Result: Accepted Time:100 ms Memory:2080 kb****************************************************************/
- ACdream 1038 (想法+排序)
- ACdream 1038 Alien Numbers (模拟)
- ACdream 1417(Number)
- ACdream发电站(贪心)
- ACdream运动会(送)
- ACdream
- Acdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- Mysql 修改字符集
- iOS 声明属性关键字讲解
- elf文件格式与动态链接库
- iphone App的国际化
- PHP jqGrid 表格数据更新帮助代码
- ACdream 1038 (想法+排序)
- webservice快速入门-使用wsimport生成ws服务端(二)
- Android接口定义语言(AIDL)
- C++逗号表达式
- 12个有趣的C语言面试题
- 如何成为一名程序员
- 内存管理
- Poj 3348 Cows (凸包面积)
- 如何彻底关闭Windows7自动更新——图文详解