您的位置:首页 > 其它

CodeForse#204(Div.2) 总结 A,B,C

2013-10-18 20:26 330 查看
A题:

给出一个数列,由0或者5组成,求这里面由0或者5所能组成的数里面,能被90整除的数的最大值。

AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
int n;
while(scanf("%d", &n)!=EOF) {
int tmp, cnt0 = 0, cnt5 = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &tmp);
if(tmp == 0)
cnt0++;
else
cnt5++;
}
if(cnt0 == 0)
printf("-1\n");
else if(cnt5 < 9)
printf("0\n");
else {
for(int i = 1; i <= (cnt5/9)*9; i++)
printf("5");
for(int i = 1; i <= cnt0; i++)
printf("0");
}
puts("");
}
return 0;
}


B题:

给出一个数列,求在相同位置上所能满足等差数列的条件的值和差值。

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int maxn=100100;
int flag[maxn];
int t[maxn];
struct node
{
int c;
int d;
bool flag;
}D[maxn];

int main()
{
int n,x,len=0;
cin>>n;
memset(D,0,sizeof(D));
memset(flag,0,sizeof(flag));
memset(t,0,sizeof(t));
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(!flag[x])
{
t[len++]=x;
flag[x]=1;
D[x].c=i;
D[x].d=0;
D[x].flag=false;
}
else
{
if(D[x].d==0)
{
D[x].d=i-D[x].c;
D[x].c=i;
}
else
{
if(i-D[x].c==D[x].d)    D[x].c=i;
else    D[x].flag=true;
}
}
}
sort(t,t+len);
//cout<<len<<endl;
int ans=0;
for(int i=0;i<len;i++)
{
int xx=t[i];
if(!D[xx].flag) ans++;
}
cout<<ans<<endl;
for(int i=0;i<len;i++)
{
int xx=t[i];
if(!D[xx].flag)
printf("%d %d\n",xx,D[xx].d);
}
return 0;
}


C题:

给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小。

考虑小数点后面的数字,如果这些数都非零,则就是  abs(原数小数部分相加-1*n), 多一个0 则 min( abs(原数小数部分相加-1*n) ,abs(原数小数部分相加-1*(n-1)) )

AC代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>

#define INF 0x7fffffff;

using namespace std;

int main() {
int n;
scanf("%d", &n);
int x, len = 0, sum = 0;
for(int i = 0; i < n*2; i++) {
scanf("%*d.%d", &x);
sum += x;
if(x == 0)
len++;
}
int ans = INF;
for(int i = 0; i <= len; i++)
ans = min(ans, abs(sum - (1000*n - 1000*i)));
printf("%d.%03d\n", ans/1000, ans%1000);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: