比赛链接:2018 Multi-University Training Contest 1
6301 Distinct Values
题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字典序最小
思路:首先在草稿纸上模拟填充过程,从左往右填充,发现规律,有最小的数则取出最小的数。越过某些区间时,某些数字又可以重复使用利用set来维护这个待取出的集合
代码:
#include<cstdio> #include<iostream> #include<set> using namespace std; const int maxn=1e5+10; int pre[maxn],ans[maxn]; int main() { int T; cin>>T; while(T--) { int n,m; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { ans[i]=1; pre[i]=i; } for(int i=1;i<=m;i++) { int a,b; scanf("%d %d",&a,&b); pre[b]=min(pre[b],a); // cout<<a<<" "<<b<<endl; } for(int i=n-1;i>=1;i--) { pre[i]=min(pre[i],pre[i+1]); } set<int>M; for(int i=2;i<=n;i++)M.insert(i); ans[1]=1; for(int i=2;i<=n;i++) { for(int j=pre[i-1];j<pre[i];j++) { M.insert(ans[j]); } ans[i]=*M.begin(); M.erase(ans[i]); } for(int i=1;i<=n;i++) printf("%d%c",ans[i]," "[i==n]); } return 0; }
6308 Time Zone
题意:给出时间和时区,转换成UTC+8的时间
思路:将所有的时间都转换成分钟,输出用%02d,可是当时卡在了精度上面
double mm=off*60.0-480.0将时间偏差转化成分钟
mm转化成整数时,由于精度损失,1.0可能被表示成0.99999,导致1.0变成0(一般精度损失是减小原数字)
特别注意:当mm为正数时,需要将mm先加0.00001,而mm为负数是应该减掉0.00001
ac代码:
#include<iostream> #include<cstdio> using namespace std; int main() { int T,h,m; double off; cin>>T; while(T--) { scanf("%d %d UTC%lf",&h,&m,&off); double mm=off*60.0-480.0; int mk; if(mm>0)mk=mm+0.0001; else mk=mm-0.0001; int now=h*60+m+mk; if(now>=0)now%=(24*60); else now+=(24*60); printf("%02d:%02d ",now/60,now%60); } return 0; }