http://codeforces.com/contest/534
A. Exam
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
if(n<=2){
printf("1\n1\n");
}
else if(n==3){
printf("2\n1 3\n");
}
else{
printf("%d\n",n);
for(int i=1;i<=n;++i){
if(~i&1)printf("%d ",i);
}
for(int i=1;i<=n;++i){
if(i&1) printf("%d ",i);
}
}
return 0;
}
B. Covered Path
题目描述:
给定初速度v1和末速度v2,运动时间t,加速度a,求在t秒内最多可以运行的路程
分析:让速度尽可能大,肯定路程就越远,暴力模拟一下
#include<bits/stdc++.h>
using namespace std;
int v1,v2,t,d;
int main()
{
scanf("%d%d%d%d",&v1,&v2,&t,&d);
int ret=v1;
for(int k=2;k<=t;++k){
for(int i=d;i>=-d;--i){
if(abs(v1+i-v2)<=(t-k)*d){
v1+=i;
break;
}
}
ret+=v1;
}
printf("%d\n",ret);
return 0;
}
C. Polycarpus’ Dice
题目描述:
给定n个骰子,每个骰子的最大点数di(1~di),求使得n个骰子的点数和为a,每个骰子不可能出现的点数的个数
分析:求每个骰子的取值范围:
假设第i个骰子的点数为x,剩余骰子的点数为y,得:
x+y=a;
y>=n-1;其余每个骰子的点数至少为1
y<=sum-d[i];其余每个骰子的点数的最值
则可得:
a-n+1>=x
a-sum+d[i]<=x
#include<bits/stdc++.h>
#define ll long long
const int MAXN=200010;
using namespace std;
ll d[MAXN],sum,n,a;
int main()
{
scanf("%I64d%I64d",&n,&a);
for(int i=1;i<=n;++i){
scanf("%I64d",&d[i]);
sum+=d[i];
}
for(int i=1;i<=n;++i){
printf("%I64d ",d[i]-(min(a-n+1,d[i])-max(a-sum+d[i],(ll)1)+1));
}
return 0;
}
D. Handshakes
题目描述:
给定n个人和每个人问候的次数,求可能的进入房间的顺序。可以3个人组成一队进入比赛,则不和该队问候
分析:
简单模拟,如果当前存在问候次数为num的人,就让该人进入房间,否则num-3(问候次数为num,现在进入和后面进入没有关系,状态是一样的,这样子操作,如果存在合法解,则这样子一定可以得到合法解)
#include<bits/stdc++.h>
const int MAXN=200100;
using namespace std;
queue<int> q[MAXN];
int vis[MAXN];
int n;
int ans[MAXN];
int main()
{
int a;
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a);
vis[a]++;
q[a].push(i);
}
int cnt=0,num=0;
while(cnt<n&&num>=0){
if(vis[num]){
vis[num]--;
ans[++cnt]=q[num].front();
q[num].pop();
num++;
}
else num-=3;
}
if(cnt<n) puts("Impossible");
else{
puts("Possible");
for(int i=1;i<=cnt;++i){
printf("%d ",ans[i]);
}
printf("\n");
}
return 0;
}
E. Berland Local Positioning System
题目描述:
有n个汽车站,按递增顺序给出每个汽车站离市中心的距离,然后给出每个站点被访问的次数,求汽车可能走的路程,如果存在多种答案,输出-1
分析:
输出-1的情况只有一种,就是路过所有点的次数都相等(除了首部和尾部),且每条边的长度有一种不相等,其他情况直接暴力搞
#include<bits/stdc++.h>
typedef long long ll;
const int inf=0x3f3f3f3f;
const int MAXN=200100;
using namespace std;
int n,m;
int a[MAXN],b[MAXN];
int Min,Max;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
scanf("%d",&m);
int x;
for(int i=1;i<=m;++i){
scanf("%d",&x);
b[x]++;
if(x==1||x==n) b[x]++;
}
Min=inf,Max=0;
for(int i=1;i<=n;++i){
Max=max(Max,b[i]);
Min=min(Min,b[i]);
}
if(Min==Max){
bool flag=true;
for(int i=1;flag&&i<=n-2;++i){
if(a[i+1]-a[i]!=a[i+2]-a[i+1])
flag=false;
}
if(!flag) puts("-1");
else{
printf("%I64d\n",(ll)(a[n]-a[1])*Min-(a[2]-a[1]));
}
}else{
ll ans=0;
for(int i=2;i<=n;++i){
ans+=(ll)(a[i]-a[i-1])*min(b[i],b[i-1]);
}
printf("%I64d\n",ans);
}
return 0;
}