http://codeforces.com/contest/1154
注意看清题意,是a+b不是-a+b;
#include
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e2+5;
int n;
ll x[4];
int main()
{
for (int i=0;i<4;i++)
{
scanf("%lld",&x[i]);
}
int loc=-1;
for (int i=0;i<4;i++)
{
if(2*x[i]==(x[(i+1)%4]+x[(i+2)%4]+x[(i+3)%4]))
{
loc=i;
break;
}
}
printf("%lld %lld %lld\n",x[loc]-x[(loc+1)%4],x[loc]-x[(loc+2)%4],x[loc]-x[(loc+3)%4]);
return 0;
}
计算不同数的种类kind,然后分类讨论
如果kind>3 则直接输出-1
如果kind==3 ,则看看左右数和中间数的绝对值差是否相等
如果kind==2,则一定有解,因为求最小的,则尽量缩小范围,如果差为偶数,则答案需要/2,如果为奇数,则直接输出
如果kind==0,则输出0
#include
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e2+5;
int n;
int a[maxn];
int num[maxn];
int main()
{
int kind=0;
memset (num,0,sizeof(num));
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(num[a[i]]==0)
{
kind++;
}
num[a[i]]++;
}
if(kind==1)
{
printf("0\n");
return 0;
}
if(kind==2)
{
int cnt=0;
int b[5];
for (int i=0;i<=100;i++)
{
if(num[i])
{
b[cnt++]=i;
}
}
if((b[0]+b[1])%2)
{
printf("%d\n",abs(b[0]-b[1]));
}
else
printf("%d\n",abs(b[0]-b[1])/2);
return 0;
}
if(kind==3)
{
int cnt=0;
int b[5];
for (int i=0;i<=100;i++)
{
if(num[i])
{
b[cnt++]=i;
}
}
if(b[2]-b[1]==b[1]-b[0])
{
printf("%d\n",b[1]-b[0]);
}
else printf("-1\n");
}
if(kind>=4) printf("-1\n");
return 0;
}
模拟 ,以星期中的某一天开始,然后开始模拟,求出最大值即可。
#include
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e2+5;
int n;
ll numa,numb,numc;
ll ans=-1;
int main()
{
scanf("%lld%lld%lld",&numa,&numb,&numc);
for (int i=1;i<=7;i++)
{
ll tnuma=numa,tnumb=numb,tnumc=numc;
ll temp=0;
int ok=0;
for (int j=i;j<=7;j++)
{
if((j==1||j==4||j==7))
{
if(tnuma)
{
tnuma--;
temp++;
}
else
{
ok=1;
break;
}
}
else if(j==2||j==6)
{
if(tnumb)
{
tnumb--;
temp++;
}
else
{
ok=1;
break;
}
}
else if(j==3||j==5)
{
if(tnumc)
{
tnumc--;
temp++;
}
else
{
ok=1;
break;
}
}
}
if(ok==1)
{
ans=max(ans,temp);
continue;
}
ll t1=tnuma/3;
ll t2=tnumb/2;
ll t3=tnumc/2;
ll ci=min(t1,min(t2,t3));
tnuma=tnuma-ci*3;
tnumb=tnumb-ci*2;
tnumc=tnumc-ci*2;
temp=temp+ci*7;
for (int j=1;j<=7;j++)
{
if((j==1||j==4||j==7))
{
if(tnuma)
{
tnuma--;
temp++;
}
else
{
break;
}
}
else if(j==2||j==6)
{
if(tnumb)
{
tnumb--;
temp++;
}
else
{
break;
}
}
else if(j==3||j==5)
{
if(tnumc)
{
tnumc--;
temp++;
}
else
{
break;
}
}
}
ans=max(ans,temp);
// printf("i=%d ans=%lld\n",i,ans);
}
printf("%lld\n",ans);
return 0;
}
贪心,注意,此题电池的数目最大为储存容量,不能超过。
当s[i]=0时,优先使用蓄电池。
当s[i]=1时,如果此时蓄电池满的话,则优先使用蓄电池,然后再使用电池,注意蓄电池+1时不能超过自身容量。
#include
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2*1e6+5;
int n,a,b;
int s[maxn];
int main()
{
scanf("%d%d%d",&n,&b,&a);
int nb=b,na=a;
for (int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
int ans=0;
for (int i=1;i<=n;i++)
{
if(s[i]==0)
{
if(a==na)
{
ans++;
na--;
}
else if(na>0)
{
ans++;
na--;
}
else
{
if(nb>0)
{
ans++;
nb--;
}
else
{
break;
}
}
}
else
{
if(a==na)
{
ans++;
na--;
}
else if(nb>0)
{
nb--;
na++;
ans++;
}
else
{
if(na>0)
{
na--;
ans++;
}
else
{
break;
}
}
}
}
printf("%d\n",ans);
return 0;
}
建立双向链表解决此题。
#include
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=2*1e5+5;
int n,k;
int loc[maxn];
int vis[maxn];
int ans[maxn];
struct List
{
int next;
int pre;
int data;
};
List l [maxn];
int main()
{
scanf("%d%d",&n,&k);
memset (vis,0,sizeof(vis));
memset (l,-1,sizeof(l));
for (int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
loc[x]=i;
l[i].data=x;
if(i==1)
{
l[i].pre=-1;
continue;
}
l[i].pre=i-1;
l[i-1].next=i;
}
l[n].next=-1;
int num=0;
int kt=n;
int ci=0;
while(num