http://codeforces.com/contest/1102
这场比赛的A题是个小思维题,连续的四个数x,x+1,x+2,x+3,则x+(x+3)=(x+1)+(x+2),所以从n开始考虑,每四个数恰好分配,最后只会剩下n%4个数,只需要简单算一下判断一下就ok,
B题略坑。。比赛的时候题意读了很久都读不懂。就先做C了。快一个小时了才又给的题意解释,勉强算是明白了,感觉倒不是难题,然而,,B题莫名又T了一发,,RE了两发,。,改了感觉并不重要的地方,换换语言,感觉代码本质没变,,然后A了,,,也真是佩服自己敢交的勇气,,,超怕被hack。。。
代码:
#include
using namespace std;
int n,k,ok,vis[5055],ans[5055];
struct AA
{
int x,rt;
bool operator<(const AA &aa)const
{
return xk) ok=1;
}
if(ok==1)
{
printf("NO\n");
return 0;
}
printf("YES\n");
sort(pos+1,pos+n+1);
for(int i=1;i<=n;i++)
{
if((i%k)==0)
ans[pos[i].rt]=k;
else ans[pos[i].rt]=(i%k);
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
return 0;
/*
if(ok)
else
cout<<"NO"<
C题小思维,跟x与y的大小有关,因为进行次数相当于无限多次,所以x>y的时候一定所有都碎了,x<=y的时候,x只能破坏<=x的门,不然y能救回来,,而且在x破坏<=x的门的后,y可以修复一扇<=x的门,这样就能多保住一扇。
代码:
#include
using namespace std;
int n,x,y,m,ok,a[100005],ans;
int main()
{
scanf("%d%d%d",&n,&x,&y);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
if(x>y)
{
cout<x) ans--;
}
cout<
D题也比较简单,就是先算一下0,1,2的数量,多于平均数t一定得转化成少于平均数的数,从前往后遍历,0的前t个0保持不变,然后后面若还有多余的0,就看看1够不够,变成1,1够了,就只能变成2,
1就是先看有没有多余的需要变成0的,然后安排1本身,最后再有多余的变成2,
2就是,2若多余,若0少,先变成0,然后1若少,变成1,最后保留为自己。
代码:
就暴力写 了,没注意美观了,,,还因为每加else if的elseWA了一发,,,也怪自己没试样例。。
#include
using namespace std;
int n,a[10],t,b[10];
string s;
int main()
{//cout<<"!"<>n>>s;
t=n/3;
for(int i=0;i=t)
{
if(a[1]t&&a[0]=t)
{
a[2]++;a[1]--;
b[2]++;
s[i]='2';
}
}
else if(s[i]=='2')
{
if(a[2]>t&&a[0]t&&a[1]
最后拼了几分钟写了个E题,又是快速幂粗心。。。没考虑0次方的情况。导致快速幂里死循环了,,T了一发。。
思路倒是也不难,就是找间断点,可以选择是否变化的点的个数,然后2的ans次方。。。就完了,倒不是难题,
思路:根据题意要求b又要递增,又要与a对应的相等的点相等,那么a中相等的点及其中间夹的所有点的值在b中都相等。与中间点a值相等的点在b中也要相同,,,所以就是循环下去,一直结束,就是一个间断点,再就是注意,最后一个数后面不能是间断点就可以了,,,
代码:
#include
using namespace std;
typedef long long ll;
#define mod 998244353
int n,a[500005];
ll ans;
ll POW(ll aa,ll bb)
{
if(bb==0) return 1;
if(bb==1) return aa%mod;
if(bb%2) return POW(aa*aa%mod,bb/2)*aa%mod;
else return POW(aa*aa%mod,bb/2);
}
int main()
{ //cout<ma;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ma[a[i]]=i;
}
for(int i=1;i