POKER(扑克)

2019-07-14 11:53发布

class="markdown_views prism-dracula"> 这里写图片描述这里写图片描述这里写图片描述

解题思路:

这个题做法很多,我直接按照题意模拟了一下,复杂度O(n),记录一下右边界,每次得到算术平方根后与上一个结果进行比较,相同则放到数组右边界,否则更新上一个结果。
代码如下: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) typedef long long ll; typedef unsigned long long ull; using namespace std; int poker[100010]; int main() { std::ios::sync_with_stdio(false); cin.tie(0); //freopen("test.txt","r",stdin); //freopen("output.txt","w",stdout); int n,t,a,li=0,mr=-1;// cin>>n; for(int i=0;icin>>a; t=n-i;//取该牌的时候是第sqrt(t)张 int cur=sqrt(t); if(cur==li)//如果和上一个结果相同 { poker[mr]=a;//放到数组的右边界 mr++; } else//否则,更新上一个结果 { poker[cur]=a; li=cur;//更新上一个结果的下标 if(cur>mr)mr=cur+1;//更新右边界,实际上仅在i==0时发挥作用 } } for(int i=1;i<=n;i++)cout<' '; cout< 还有用动态数组的一种写法,是将数组逆序存了一下,利用insert()函数插入下标之前的特点。最后的输出还是第一次见。。一直都是用迭代器的,还有这种操作?? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f #define MOD 1000000007 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define meminf(a) memset(a,inf,sizeof(a)) typedef long long ll; typedef unsigned long long ull; using namespace std; int a[100010]; int main() { std::ios::sync_with_stdio(false); cin.tie(0); //freopen("test.txt","r",stdin); //freopen("output.txt","w",stdout); int n; cin>>n; vector<int> res; for(int i=1;i<=n;i++)scanf("%d",&a[n-i+1]);//逆序保存 for(int i=1;i<=n;i++)res.insert(res.begin()+sqrt(i)-1,a[i]);//插入到下标sqrt(i)-1之前,后面的元素整体移动一位 /*vector::iterator it; for(it=res.begin();it!=res.end();it++) cout<<*it< for(auto x:res)cout<' '; return 0; }

热门文章