链接:http://codeforces.com/contest/673
A:
看一个节目最长90分钟,给你n个时间点,代表感兴趣的点,如果从某一个点到下一个点时间超过15分钟就不看了,问最多看多长时间。
直接按题意模拟一遍。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int a[100];
int main() {
int n;
int ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++) {
if(a[i]-a[i-1]>15) {
break;
}
ans=a[i];
}
cout<<min(ans+15,90)<<endl;
return 0;
}
B:
给你n个问题,m组相似问题,现在要将这些问题分成两组(每个组不能为空),相似问题不能放到同一组,且第一组(a)所有的编号大于第二组(b)的编号,问你有多少种分配方案。
将每组相似问题的小编号放到b,大的放到a,然后在a中取出最小值,b中取出最大值,如果bmax>amin,则无解。
显然大于amin小于bmax的对答案没有贡献,所以答案就在bmax~amin中,输出amin-bmin。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int maxx,minn;
int vis[Mn];
int main() {
int n,m;
scanf("%d%d",&n,&m);
int flag=0;
minn=n;
for(int i=1;i<=m;i++) {
int x, y;
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
vis[x]=1;
vis[y]=1;
minn=min(y,minn);
maxx=max(x,maxx);
if(minn<=maxx) flag=1;
}
if(flag) {
cout<<0<<endl;
return 0;
}
if(m==0) {
cout<<n-1<<endl;
return 0;
}
int ans=1;
for(int i=1;i<=n;i++) {//其实减一下就得到答案了
if(vis[i]==0) {
if(i>=maxx&&i<=minn) ans++;
}
}
cout<<ans<<endl;
return 0;
}
C:给你一个区间,让你求出每个区间的众数,这个众数的ans++。输出每个众数的ans。
直接暴力枚举区间左端点,然后滑动窗格求出。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int num[Mn];
int ans[Mn];
int a[Mn];
int main() {
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++) {
for(int j=i;j<=n;j++) num[a[j]]=0;
for(int j=i,pos=a[i];j<=n;j++) {
num[a[j]]++;
if(j!=i) {
if(num[a[j]]>num[pos]) {
pos=a[j];
}
if(num[a[j]]==num[pos]) pos=min(a[j],pos);
}
ans[pos]++;
}
}
for(int i=1;i<=n;i++) {
printf("%d ",ans[i]);
}
return 0;
}
D:
给你n个点。其中的四个点(abcd)已给出,让你用不超过k条边且最小的边使得,a经过所有的点一次到b,c同样到d,且ab,cd没有直接路径。
假设我们只有四个点,我们只有完全图才可以所有点经过一次,暗示这样ab,cd就有了直接路径。去掉后,ac,db这两条线有个交点,认为是第五个点,
通过他才满足条件。多余五个点的随便放到一条边上。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 200010
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int vis[Mn];
int main() {
int n,k;
scanf("%d%d",&n,&k);
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
vis[a]=1;vis[b]=1;vis[c]=1;vis[d]=1;
if(k<n+1) {
cout<<-1<<endl;
return 0;
}
if(n<=4) {
cout<<-1<<endl;
return 0;
}
int pos=0;
for(int i=1;i<=n;i++) {
if(vis[i]==0) {
pos=i;
vis[pos]=1;
break;
}
}
cout<<a;
for(int i=1;i<=n;i++) {
if(vis[i]) continue;
vis[i]=2;
printf(" %d",i);
}
printf(" %d %d %d %d\n",d,pos,c,b);
printf("%d %d %d %d ",c,b,pos,a);
for(int i=1;i<=n;i++) {
if(vis[i]!=2) continue;
printf("%d ",i);
}
cout<<d<<endl;
return 0;
}