sdutoj 顺序表应用2:多余元素删除之建表算法
题目链接:https://acm.sdut.edu.cn/onlinejudge3/problems/3325
早上起来来一个顺序表的醒醒神.....
先说坑点:
对于这道题或者是oj来讲,卡时间太严了,把定义在数据的循环次数外面好像比定义在里面更省时间,并且全局变量的话也是更耗时的(这一点我知道)
如果要是真是如此的话,以后设计变量的时候可得小心点了,
第一次碰到这种情况,在hduoj里没有见到过,或许是hduoj太松了???不可能吧,
今天查阅一下资料,看看是否是这样的;
题目思路:
这个题在我看来用的在线处理思想;
前面已经说了,用删除的操作已经不行了,我手贱试了一下,果然
不行,卡了5个点;
而这个题的思路是:
先当数组是一个空的数组
每次输入的时候判断数组中的元素是否和输入的元素相同,如果不同的话不赋值,相同的话就赋值并且相当于动态申请了一位;
当然,这是并不是真的动态申请,而是数组的下标加一;
而输入完成以后,数组中的元素就会没有相同的元素了;
小的细节:
1 for(register int i=0;i) 2 { 3 flag=1; 4 int temp; 5 cin>>temp; 6 for(register int j=0;j ) 7 { 8 if(a[j]==temp)//如果有相同的元素修改判断变量并且停止 9 { 10 flag=0; 11 break; 12 } 13 } 14 if(flag)//没有相同元素就存入并且起始下标加一 15 { 16 a[n]=temp; 17 n++; 18 } 19 }
对于和输入元素相同的代码来讲,直接修改判断变量并且退出进行下一个判断,
而对于相同的元素,就是判断结束后判断变量依旧是不变的就证明没有输入的元素和数组的元素相同,
那就将这个元素存入数组之中并且下标加一就ok了
也就实现了模拟的动态申请;
Talk is cheap. Show me the code.
1 #include//卡点飘过,4个点就TLE了,我三个 2 using namespace std; 3 const int num=1e4+10; 4 int main() 5 { 6 std::ios::sync_with_stdio(false); 7 cin.tie(0); 8 cout.tie(0); 9 int t;//无多大影响少用全局变量,耗时 10 cin>>t; 11 int flag; 12 int m;//如果没有影响也把一些必要变量定义在外面,在一定程度上可以节省世界------emm至少在sdutoj是这样,hduoj应该不会这么严吧 13 int a[num]; 14 int n; 15 while(t--) 16 { 17 n=0; 18 flag=0; 19 //memset(a,0,sizeof()) 20 memset(a,0,sizeof(a)); 21 cin>>m; 22 for(register int i=0;i ) 23 { 24 flag=1; 25 int temp; 26 cin>>temp; 27 for(register int j=0;j ) 28 { 29 if(a[j]==temp)//如果有相同的元素修改判断变量并且停止 30 { 31 flag=0; 32 break; 33 } 34 } 35 if(flag)//没有相同元素就存入并且起始下标加一 36 { 37 a[n]=temp; 38 n++; 39 } 40 } 41 for(register int i=0;i ) 42 printf("%d ",a[i]); 43 cout<<endl; 44 } 45 return 0; 46 }