贪心 ( HDU 5821 )——2016 Multi-University Training Contest 8 1001
2016-08-12 10:40
615 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5821
分析:
比赛的时候已经把球的最终位置按顺序标号再按球的初始位置排进数组里。。。不过区间操作采取的是把区间内标号清0,(一觉睡醒没时间了,胡乱想的。。。),当时多想一会应该能想到是区间内排序操作。。
题解:
因为如果初始状态能排成最终状态,那么每一个位置是0还是1还是2都没关系,我们只需要在初始状态中找到对应的数字在最终状态的位置,然后排成数组,最后的区间操作就是区间内排序,如果最后能够排成单调递增的序列就是能够按照最终状态摆放。
AC代码:
http://acm.hdu.edu.cn/showproblem.php?pid=5821
分析:
比赛的时候已经把球的最终位置按顺序标号再按球的初始位置排进数组里。。。不过区间操作采取的是把区间内标号清0,(一觉睡醒没时间了,胡乱想的。。。),当时多想一会应该能想到是区间内排序操作。。
题解:
因为如果初始状态能排成最终状态,那么每一个位置是0还是1还是2都没关系,我们只需要在初始状态中找到对应的数字在最终状态的位置,然后排成数组,最后的区间操作就是区间内排序,如果最后能够排成单调递增的序列就是能够按照最终状态摆放。
AC代码:
/************************************************************************* > File Name: 1001.cpp > Author: Akira > Mail: qaq.febr2.qaq@gmail.com > Created Time: 2016年08月11日 星期四 21时48分12秒 ************************************************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cmath> #include <vector> #include <set> #include <list> typedef long long LL; typedef unsigned long long ULL; typedef long double LD; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Sqr(a) ((a)*(a)) using namespace std; #define MaxN 100000 #define MaxM MaxN*10 #define INF 1000000000 int T; int n,m; int a[1111]; int b[1111]; int color[1111]; int loc[1111][1111]; int need[1111]; int main() { scanf("%d", &T); while(T--) { CLR(color); CLR(loc); CLR(need); scanf("%d%d", &n, &m); for(int i=1;i<=n;i++) { scanf("%d", &a[i]); if(a[i]!=0) color[a[i]]++; //记录初始状态每种颜色的球的个数 } for(int i=1;i<=n;i++) { scanf("%d", &b[i]); if(b[i]!=0) color[b[i]]--; //计数最终状态每种颜色的球的个数 loc[b[i]][++loc[b[i]][0]] = i; //并把最终位置记录每种球的坐标(loc[颜色][0]记录某种颜色的球一共多少个) } for(int i=1;i<=n;i++) { if(loc[a[i]][0]>0) { int ll = 1; while(loc[a[i]][ll] == -1) ll++; need[i] = loc[a[i]][ll]; //遍历初始状态找到每个球最终状态的位置,排进数组 loc[a[i]][ll] = -1; } } /* for(int i=1;i<=n;i++) { cout << need[i] << " "; } cout << endl; */ int flag = 0; for(int i=0;i<=n;i++) { if(color[i]!=0) //比对最终位置和初始位置每种球的个数是否一致 { flag = 1; break; } } for(int i=0;i<m;i++) { int l,r; scanf("%d%d", &l, &r); sort(need+l,need+r+1); //区间排序操作 // for(int i=l;i<=r;i++) // cout << need[i]<<endl; } for(int i=2;i<=n;i++) { // cout<< need[i-1] << "-"; if(need[i-1]>need[i]) //如果不单调递增,则不成功 { flag = 1; break; } } //cout << need <<endl; if(flag) cout << "No\n"; else cout << "Yes\n"; } return 0; }
相关文章推荐
- hdu 5821 Ball(2016 Multi-University Training Contest 8——贪心+排序)
- HDU 5793 A Boring Question(推公式+求逆元)——2016 Multi-University Training Contest 6 (1001)
- 2016 Multi-University Training Contest 2 1001 hdu 5734 暴力
- 数学——Acperience ( HDU 5734) ( 2016 Multi-University Training Contest 2 1001 )
- hdu 5802 Windows 10(2016 Multi-University Training Contest 6——贪心+dfs)
- 贪心——Windows10 ( HDU 5802 ) ( 2016 Multi-University Training Contest 6 1010 )
- HDU 5723 Abandoned country(2016 Multi-University Training Contest 1的1001题)
- hdu 5821 2016 Multi-University Training Contest 8(排序)
- 2016 Multi-University Training Contest 1 1001 hdu 5723 DFS+并查集最小生树
- (HDU 5802)2016 Multi-University Training Contest 6 Windows 10 (贪心)
- HDU 5821 Ball 2016 Multi-University Training Contest 8
- (HDU 5813)2016 Multi-University Training Contest 7 Elegant Construction (贪心、图论)
- hdu 5821 2016 Multi-University Training Contest 8 Ball 解题报告
- 2016 Multi-University Training Contest 1-1001---HDU 5723 Abandoned country(DFS+最小生成树)
- 2016 Multi-University Training Contest 2-1001---HDU 5734 Acperience
- 贪心——HDU 5813 ( 2016 Multi-University Training Contest 7 1005 )
- DP+KMP——Another Meaning ( HDU 5763 ) ( 2016 Multi-University Training Contest 4 1001 )
- 2016 Multi-University Training Contest 1-1005---HDU 5727 Necklace(枚举+二分图匹配)
- hdu 5733 tetrahedron(2016 Multi-University Training Contest 1——几何公式题)
- 2016 Multi-University Training Contest 1-1011---HDU 5733 tetrahedron(计算几何)