标签:hdu1276 指针 存储 ios pre sig freopen color mes
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276
题目给出一个数n,表示序列长度是n,且第i位为i,操作是从中删除二的倍数,然后重新组数,再删除三的倍数,然后重新组数,这样循环迭代,直到数的数量小于三。因为只有删除操作,而且每次删除之后的数都要重新组合,所以我们想到了一种高效删除和添加的数据结构——链表,这种数据结构删除和插入的时间复杂度是常数的,这是基于链表的存储方式的,改变指针指向一个地址的操作是常数时间的。
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef unsigned int ui; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define pf printf 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 #define prime1 1e9+7 9 #define prime2 1e9+9 10 #define pi 3.14159265 11 #define lson l,mid,rt<<1 12 #define rson mid+1,r,rt<<1|1 13 #define scand(x) scanf("%llf",&x) 14 #define f(i,a,b) for(int i=a;i<=b;i++) 15 #define scan(a) scanf("%d",&a) 16 #define mp(a,b) make_pair((a),(b)) 17 #define P pair<int,int> 18 #define dbg(args) cout<<#args<<":"<<args<<endl; 19 #define inf 0x7ffffff 20 inline int read(){ 21 int ans=0,w=1; 22 char ch=getchar(); 23 while(!isdigit(ch)){if(ch==‘-‘)w=-1;ch=getchar();} 24 while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-‘0‘,ch=getchar(); 25 return ans*w; 26 } 27 int n,m,t; 28 const int maxn=1e4+10; 29 int main() 30 { 31 //freopen("input.txt","r",stdin); 32 //freopen("output.txt","w",stdout); 33 std::ios::sync_with_stdio(false); 34 t=read(); 35 while(t--) 36 { 37 n=read(); 38 int num=2; 39 list<int> l; 40 list<int>::iterator it;//声明链表的迭代器 41 f(i,1,n)l.push_back(i); 42 while(l.size()>3) 43 { 44 int i=1; 45 it=l.begin(); 46 while(it!=l.end()) 47 { 48 if(!(i++%num))it=l.erase(it);//删除之后返回下一个位置的指针 49 else it++; 50 } 51 if(num==2)num=3; 52 else num=2; 53 } 54 it=l.begin(); 55 while(it!=l.end()) 56 { 57 if(it==l.begin())pf("%d",*it); 58 else pf(" %d",*it); 59 it++; 60 } 61 pf("\n"); 62 } 63 }
标签:hdu1276 指针 存储 ios pre sig freopen color mes
原文地址:https://www.cnblogs.com/randy-lo/p/12607874.html