HDU 6301:
题意:构造一个长度为n的数组a,这个数组满足m个限制条件,每个限制条件给定 l r,要求 a[l] - a[r]之间不能有重复的数。并且满足a数组字典序最小。
思路:字典序的话我们肯定是要尽量从小数开始放,当我们考虑一个区间时,如果当前区间的前面一部分区间已经放了数,我们就要想办法把这些数去掉,然后从剩下的数中依次取最小的数填充区间,这样紫的话考虑用 set ,set不仅从小到大排了序,还没有重复元素。。。
我们再用一个pre数组,pre[i] = k表示 从 k 到 i 这个区间不能有重复的元素。所以 假设一个限制条件是 l 到 r之间不能有重复的元素,那么 pre[r] = l,pre[r-1] = l....pre[l] = l。是吧?这个看代码就知道怎么实现了。
然后整个代码就可以在 n*logn的时间复杂度内解决了。
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <set>
#include <algorithm>
#include <stdlib.h>
using namespace std;
const int maxn = 1e5+5;
int ans[maxn],pre[maxn];
set<int>s;
struct node{
int l,r;
}gp[maxn];
int cmp(node a,node b){
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&gp[i].l,&gp[i].r);
}
sort(gp+1,gp+m+1,cmp);
int mm = 0,i=1;
gp[m+1].l = -1;
gp[0].l=-1;
gp[0].r=-1;
while(i<=m){/// 这个循环是去掉包含区间比如[4,10],[4,8].只保留[4,10]
for(int j=i;;j++){
if(gp[j].l!=gp[i].l){
gp[++mm].l=gp[j-1].l;
gp[mm].r = gp[j-1].r;
i = j;
break;
}
}
}
s.clear();
for(int i=1;i<=n;i++){
ans[i] = 1;
s.insert(i);
pre[i] = i;
}
for(int i=1;i<=mm;i++){
pre[gp[i].r] = min(pre[gp[i].r],gp[i].l);
}
int Min = 10000009;
for(int i=n;i>=1;i--){
Min = min(Min,pre[i]);
pre[i] = Min;
}
int len = 0;
int curren = 1;
for(int i=1;i<=n;i++){
while(curren<pre[i]){//在pre[i]之前的是可以重复的加入set
s.insert(ans[curren]);
++curren;
}
ans[i] = *s.begin();
s.erase(ans[i]);///加进答案之后不知道能不能重复,
///先去掉,能重复的话再通过while循环加进来
}
for(int i=1;i<=n;i++){
printf("%d%c",ans[i],(i==n?'\n':' '));
}
}
return 0;
}
HDU 6308:
题意:当前是北京时间,问你另一时区的当前时间是多少?
思路:只要知道0.1是6分钟就好了。
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int hh,mm;
char s[10];
scanf("%d %d %s",&hh,&mm,s);
int len = strlen(s),k,y=0;
if(len == 5){
k = s[4] - '0';
}
else if(len == 6){
k = (s[4]-'0')*10 + s[5] - '0';
}
else{
k = 0;
int flag = 1;
for(int i=0;i<len;i++){
if(flag&&s[i]>='0'&&s[i]<='9'){
k = k * 10 + s[i] - '0';
}
if(s[i]=='.'){
flag = 0;
continue;
}
if(!flag){
y = y * 10 + s[i]-'0';
}
}
}
if(s[3] == '-'){
k = -k;
y = -y;
}
int kcha = k - 8;
int ycha = y*6 - 0;
int flag = 0;
mm = (mm + ycha);
if(mm>=60){
mm = mm - 60;
flag = 1;
}
else if(mm<0){
mm = mm + 60;
flag = -1;
}
hh = (hh + kcha + flag + 24) %24;
printf("%02d:%02d\n",hh,mm);
}
return 0;
}