T1 Fashion in Berland
题意:
给你一串数字由0和1组成,要求整个串里必须只有一个0(只有一个数除外).
解法:
暴力.
代码:
#include <bits/stdc++.h>
using namespace std ;
int x[10000 ];
int main()
{
int a, bu = 0 ;
cin >> a;
for (int i = 1 ; i <= a; i++)
{
cin >> x[i];
if (x[i] == 0 )
bu++;
}
if ((bu == 1 && a > 1 ) || (a == 1 && bu == 0 ))
cout << "YES" ;
else
cout << "NO" ;
return 0 ;
}
小结:
**此类题目水题。**
T2 s-palindrome
题意:
给你一个字符串,请问其整个对折可不可以重合?
解法:
暴力.
代码:
#include <bits/stdc++.h>
using namespace std ;
char x[10000 ];
int main()
{
int lan = 0 ;
char zz;
while (scanf ("%c" , &zz) == 1 && zz != 10 )
{
lan++;
x[lan] = zz;
}
for (int i = 1 ; i <= lan / 2 ; i++)
{
if (x[i] == 'A' && x[lan - i + 1 ] == 'A' )
continue ;
else if (x[i] == 'b' && x[lan - i + 1 ] == 'd' )
continue ;
else if (x[i] == 'd' && x[lan - i + 1 ] == 'b' )
continue ;
else if (x[i] == 'H' && x[lan - i + 1 ] == 'H' )
continue ;
else if (x[i] == 'I' && x[lan - i + 1 ] == 'I' )
continue ;
else if (x[i] == 'U' && x[lan - i + 1 ] == 'U' )
continue ;
else if (x[i] == 'M' && x[lan - i + 1 ] == 'M' )
continue ;
else if (x[i] == 'o' && x[lan - i + 1 ] == 'o' )
continue ;
else if (x[i] == 'O' && x[lan - i + 1 ] == 'O' )
continue ;
else if (x[i] == 'p' && x[lan - i + 1 ] == 'q' )
continue ;
else if (x[i] == 'q' && x[lan - i + 1 ] == 'p' )
continue ;
else if (x[i] == 'X' && x[lan - i + 1 ] == 'X' )
continue ;
else if (x[i] == 'x' && x[lan - i + 1 ] == 'x' )
continue ;
else if (x[i] == 'Y' && x[lan - i + 1 ] == 'Y' )
continue ;
else if (x[i] == 'T' && x[lan - i + 1 ] == 'T' )
continue ;
else if (x[i] == 'V' && x[lan - i + 1 ] == 'V' )
continue ;
else if (x[i] == 'v' && x[lan - i + 1 ] == 'v' )
continue ;
else if (x[i] == 'W' && x[lan - i + 1 ] == 'W' )
continue ;
else if (x[i] == 'w' && x[lan - i + 1 ] == 'w' )
continue ;
else
{
cout << "NIE" ;
return 0 ;
}
}
if (lan % 2 == 1 && x[lan / 2 + 1 ] == 'A' || x[lan / 2 + 1 ] == 'H' || x[lan / 2 + 1 ] == 'I' || x[lan / 2 + 1 ] == 'M' || x[lan / 2 + 1 ] == 'O' || x[lan / 2 + 1 ] == 'o' || x[lan / 2 + 1 ] == 'T' || x[lan / 2 + 1 ] == 'U' || x[lan / 2 + 1 ] == 'V' || x[lan / 2 + 1 ] == 'v' || x[lan / 2 + 1 ] == 'W' || x[lan / 2 + 1 ] == 'w' || x[lan / 2 + 1 ] == 'x' || x[lan / 2 + 1 ] == 'X' || x[lan / 2 + 1 ] == 'Y' )
cout << "TAK" ;
else if (lan % 2 == 0 )
cout << "TAK" ;
else
cout << "NIE" ;
return 0 ;
}
小结:
**此类题目暴力。**
T3 Exponential notation
题意:
给你一个数,把他转换成科学计数法.
解法:
暴力。
代码:
#include <bits/stdc++.h>
using namespace std ;
char x[1000000 ];
int main()
{
char zz;
int lan = 0 , flag = -1000 , flag2;
while (scanf ("%c" , &zz) == 1 && zz != 10 )
{
lan++;
x[lan] = zz;
if (x[lan] == '.' )
flag = lan;
}
int tou = 1 , wei = lan;
while (x[tou] == '0' || x[tou] == '.' )
tou++;
while (x[wei] == '0' || x[wei] == '.' )
wei--;
if (flag == -1000 )
{
cout << x[tou];
if (wei - tou > 0 )
cout << "." ;
for (int i = tou + 1 ; i <= wei; i++)
cout << x[i];
if (lan - tou > 0 )
cout << "E" << lan - tou;
}
else
{
flag2 = flag - tou;
cout << x[tou];
if (wei != tou)
cout << "." ;
for (int i = tou + 1 ; i <= wei; i++)
if (x[i] != '.' )
cout << x[i];
if (flag2 != 1 && flag2 > 0 )
cout << "E" << flag2 - 1 ;
else if (flag2 != 1 )
cout << "E" << flag2;
}
return 0 ;
}
小结:
**此类题目暴力。**
T4 Swaps in Permutation
题意:
给你一串数字,在给你一些规则,规则是可以将某些位上的数字交换,请输出最大数字串.
解法:
大头堆.
代码:
using namespace std;
int fa[N], nn, mm;
priority_queue<int > p[N];
int find(int a)
{
if (fa[a] == a)
return fa[a];
else
{
fa[a] = find(fa[a]);
return fa[a];
}
}
int main()
{
int a, b, flag;
cin >> a >> b;
for (int i = 1 ; i <= a; i++)
{
scanf("%d " , &flag);
fa[i] = i;
p[i].push (flag);
}
for (int i = 1 ; i <= b; i++)
{
scanf("%d %d " , &mm, &nn);
if (find(mm) == find(nn))
continue ;
else if (p[find(mm)].size() > p[find(nn)].size())
{
while (!p[fa[nn]].empty())
{
p[fa[mm]].push (p[fa[nn]].top());
p[fa[nn]].pop ();
}
fa[fa[nn]] = fa[mm];
}
else
{
while (!p[fa[mm]].empty())
{
p[fa[nn]].push (p[fa[mm]].top());
p[fa[mm]].pop ();
}
fa[fa[mm]] = fa[nn];
}
}
for (int i = 1 ; i <= a; i++)
{
cout << p[find(i)].top() << " " ;
p[find(i)].pop ();
}
return 0 ;
}
小结:
**此类题目较易,就是不好调试。**
T5 Xor-sequences
题意:
给定序列,从序列中选择k(1≤k≤1e18)个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二进制表示中1的个数是3的倍数。问长度为k的满足条件的 序列有多少种?
解法:
矩阵快速幂
代码:
using namespace std;
int n, m , que[200010 ], top, s [2 ], w, hhh[200010 ], q qq[200010] ;
map <int , int > mmm;
struct point
{
int v, id;
bool operator<(const point b) const { return v < b.v; }
} p[200010 ];
int main()
{
scanf("%d %d " , &n, &m );
for (int i = 1 ; i <= n; i++)
scanf("%d " , &p[i].v), p[i].id = i, q qq[i] = p[i].v;
sort (p, p + 1 + n);
hhh[p[1 ].id] = 1 ;
s [p[1 ].v & 1 ]++;
mmm[p[1 ].v] = 1 ;
for (int i = 2 ; i <= n; i++)
if (p[i].v != p[i - 1 ].v && s [p[i].v & 1 ] < (n >> 1 ))
hhh[p[i].id] = 1 , s [p[i].v & 1 ]++, mmm[p[i].v] = 1 ;
s [0 ] = (n >> 1 ) - s [0 ];
s [1 ] = (n >> 1 ) - s [1 ];
int cnt = s [0 ] + s [1 ];
for (int i = 1 ; i <= m && (s [0 ] || s [1 ]); i++)
if (!mmm[i] && s [i & 1 ])
que[top++] = i, s [i & 1 ]--;
if (s [0 ] || s [1 ])
printf ("-1\n" );
else
{
printf ("%d \n" , cnt);
for (int i = 1 ; i <= n; i++)
{
if (hhh[i])
printf ("%d " , q qq[i] );
else
printf ("%d " , que[--top]);
}
}
return 0 ;
}
小结:
**此类题目较难。,好题**
T6 Couple Cover
题意:
给一个数列,问这里面有多少对的积大于等于p;
解法:
预处理.
代码:
#include <bits/stdc++.h>
using namespace std ;
#define LL long long
const int N = 3000001 ;
LL x[N], y[N];
int main(void )
{
LL i, j, k, n, m;
scanf ("%I64d" , &n);
for (LL i = 1 ; i <= n; i++)
{
scanf ("%I64d" , &k);
x[k]++;
}
for (LL i = 1 ; i < N; i++)
for (LL j = 1 ; j * i < N; j++)
y[i * j] += x[i] * (x[j] - (i == j));
for (LL i = 1 ; i < N; i++)
y[i] += y[i - 1 ];
scanf ("%I64d" , &m);
while (m--)
{
scanf ("%I64d" , &k);
printf ("%I64d\n" , n * (n - 1 ) - y[k - 1 ]);
}
return 0 ;
}
小结:
**此类题目较难。**