大意是往天平上方法吗..用字符串随便搞一下就行..
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
using namespace std;
typedef long long ll;
int n,m;
string s;
int main()
{
// freopen("in.txt","r",stdin);
cin>>s;
string ls="",rs="";
int i=0;
int l=0,r=0;
m=0;
while (s[i]!='|')
{
ls+=s[i];
i++;
l++;
}
i++;
while (s[i])
{
rs+=s[i];
r++;
i++;
}
cin>>s;
int len=s.length();
for (int i=0; i<len; i++)
{
if (l<r)
{
ls=s[i]+ls;
l++;
}
else rs=rs+s[i],r++;
}
if (ls.length()!=rs.length())
{
cout<<"Impossible"<<endl;
}
else
{
cout<<ls<<"|"<<rs<<endl;
}
return 0;
}
B
注意到题目中若w-(x-b)实质上就是b-x+w。。也就是一直执行b=b-x,若不够减就补上一个w,那么假设一共做了k个操作,b总共减了k个x,那么我们只要算出来补了多少个w,就能算出a的值。首先对b,求一下b在0--w-1上对称点也就是b=w-b-1,然后可得到k次操作后,b=(b+k*x)%w,a=a-(b+k*x)/w.c=c-k
a,c都是递减的,所以二分k就能求出答案..
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
ll a,b,w,x,c;
bool check(ll k)
{
ll p=a-(b+k*x)/w;
ll q=c-k;
if (q<=p) return true;
return false;
}
int main()
{
// freopen("in.txt","r",stdin);
cin>>a>>b>>w>>x>>c;
b=w-b-1;
if (c<=a)
{
cout<<0<<endl;
return 0;
}
ll l=1LL,r=1LL<<62;
ll m;
while (l<r)
{
m=(l+r)>>1;
if (!check(m)) l=m+1;
else r=m;
}
cout<<l<<endl;
}
这题也没什么说的。。细心一下分情况讨论就行....
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=120000;
int n,m;
int num[maxn];
int sub[maxn];
int ts[10],ti[10];
int cs,ci;
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for (int i=0; i<n; i++)
scanf("%d",&num[i]);
sort(num,num+n);
set<int> ss;
ss.clear();
for (int i=0; i<n-1; i++)
{
sub[i]=num[i+1]-num[i];
ss.insert(sub[i]);
}
if (n==1)
{
printf("-1\n");
return 0;
}
else if (n==2)
{
if (num[0]==num[1])
{
printf("1\n");
printf("%d\n",num[0]);
return 0;
}
if ((num[0]+num[1]) % 2==0)
{
printf("3\n");
printf("%d %d %d\n",num[0]-sub[0],(num[0]+num[1])>>1,num[1]+sub[0]);
}
else
{
printf("2\n");
printf("%d %d\n",num[0]-sub[0],num[1]+sub[0]);
return 0;
}
return 0;
}
else
{
if (ss.size()>2)
{
printf("0\n");
return 0;
}
if (ss.size()==1)
{
if (sub[0]==0)
{
printf("1\n");
printf("%d\n",num[0]);
return 0;
}
else
{
printf("2\n");
printf("%d %d\n",num[0]-sub[0],num[n-1]+sub[0]);
return 0;
}
}
else
if (ss.size()==2)
{
ci=cs=0;
memset(ts,0,sizeof ts);
memset(ti,0,sizeof ti);
for (int i=0; i<n-1; i++)
{
if (cs==0)
{
cs++;
ts[cs]=sub[i];
ci++;
ti[ci]=1;
}
else
{
if (sub[i]!=ts[1])
{
ts[2]=sub[i];
ti[2]++;
}
else
{
ti[1]++;
}
}
}
if (ti[1]!=1 && ti[2]!=1)
{
printf("0\n");
return 0;
}
if (ts[1]*2!=ts[2] && ts[2]*2!=ts[1])
{
printf("0\n");
return 0;
}
int mark;
int mp;
if (ti[1]==1) mark=ts[1],mp=ts[2];
else mark=ts[2],mp=ts[1];
if (mark*2==mp && ti[1]==1 && ti[2]==1)
swap(mp,mark);
if (mp*2!=mark)
{
printf("0\n");
return 0;
}
int out=0;
for (int i=0; i<n-1; i++)
if (sub[i]==mark)
out=(num[i]+num[i+1])>>1;
printf("1\n");
printf("%d\n",out);
return 0;
}
}
return 0;
}