T1 Jzzhu and Children
题意:
给你三个数,要求取出三个数,以1:2:4为比例,输出和.
解法:
暴力.
代码:
#include <bits/stdc++.h>
using namespace std ;
#define N 1000000
#define LL long long
int main()
{
int a,b,c;
cin >>a>>b>>c;
int ans=0 ;
while (ans*1 <=a&&ans*2 <=b&&ans*4 <=c)
ans++;
cout <<(ans-1 )*7 ;
return 0 ;
}
小结:
**此类题目水题。**
T2 Decoding
题意:
给你一个字符串,它是由原字符串通过不断取中位符所取出来的,输出原字符串.
解法:
暴力.
代码:
#include <bits/stdc++.h>
using namespace std ;
#define N 1000000
#define LL long long
int tou, wei;
char x[100000 ], ans[10000 ];
int main()
{
int a;
cin >> a;
for (int i = 1 ; i <= a; i++)
cin >> x[i];
if (a % 2 != 0 )
{
tou = a / 2 , wei = tou + 1 ;
for (int i = 1 ; i <= a; i++)
{
if (i % 2 == 1 )
{
ans[wei] = x[i];
wei++;
}
if (i % 2 == 0 )
{
ans[tou] = x[i];
tou--;
}
}
}
else
{
tou = a / 2 , wei = tou + 1 ;
for (int i = 1 ; i <= a; i++)
{
if (i % 2 != 0 )
{
ans[tou] = x[i];
tou--;
}
else
{
ans[wei] = x[i];
wei++;
}
}
}
for (int i = 1 ; i <= a; i++)
cout << ans[i];
return 0 ;
}
小结:
**此类题目暴力。**
T3 Tram
题意:
太麻烦了自己看,就是一个简单的模拟.
解法:
暴力。
代码:
#include <bits/stdc++.h>
using namespace std ;
int s, r, mu, vc, vr, p, d;
int main()
{
cin >> s >> r >> mu;
cin >> vc >> vr;
cin >> p >> d;
if (r > mu)
{
r = s - r;
mu = s - mu;
d *= -1 ;
p = s - p;
}
p *= d;
if (p > r)
p -= 2 * s;
int ans = min((mu - r) * vr, (mu - p) * vc);
printf ("%d\n" , ans);
}
小结:
**此类题目暴力。**
T4 Green and Black Tea
题意:
你有几个茶包,有两种,每种不能连续喝超过k包,给你绿包喝红包的数量,用"G"和"B",表示喝的顺序,
解法:
暴力模拟.
代码:
#include <bits/stdc++.h>
using namespace std ;
#define LL long long
#define N 400010
char x[N];
int main()
{
char dan, xiaon;
int n, k, a, b, da = 0 , xiao;
cin >> n >> k >> a >> b;
xiao = min(a, b);
if (xiao == a)
{
xiaon = 71 ;
dan = 66 ;
}
else
{
xiaon = 66 ;
dan = 71 ;
}
da = max(a, b);
if (da * 1.0 / (xiao + 1 ) > k)
{
cout << "NO" ;
return 0 ;
}
else
{
da -= xiao;
for (int i = 1 ; i <= xiao; i++)
{
if (da > k - 1 )
{
for (int i = 1 ; i <= k - 1 ; i++)
{
cout << dan;
n--;
if (n == 0 )
return 0 ;
}
da -= k - 1 ;
}
cout << dan;
n--;
if (n == 0 )
return 0 ;
cout << xiaon;
n--;
if (n == 0 )
return 0 ;
}
}
for (int i = 1 ; i <= da; i++)
{
cout << dan;
n--;
if (n == 0 )
return 0 ;
}
return 0 ;
}
小结:
**此类题目较易,就是不好调试。**
T5 Numbers Exchange
题意:
给你几个数,和另几个数,经过几次转换,让奇数和偶数的个数相同,问最少可以有几次交换.
解法:
根据题意写就行了,找规律。
代码:
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 ;
}
小结:
**此类题目较难。**
T5 Music in Car
题意:
你在车上,可以听歌,每首歌有一个价值,你可以在只听n首的一半.
解法:
暴力.
代码:
#include <bits/stdc++.h>
using namespace std ;
const int MAXN = 200005 ;
int a[MAXN], t[MAXN];
multiset <int > hh, gg;
int main()
{
int n, w, k;
scanf ("%d%d%d" , &n, &w, &k);
for (int i = 1 ; i <= n; i++)
{
scanf ("%d" , &a[i]);
a[i] += a[i - 1 ];
}
for (int i = 1 ; i <= n; i++)
scanf ("%d" , &t[i]);
int ans = 0 ;
for (int l = 1 , r = 0 ; l <= n; l++)
{
while (k >= 0 && r <= n)
if ((++r) <= n)
{
k -= (t[r] + 1 ) / 2 ;
gg.insert(t[r]);
while ((int )gg.size() > w)
{
k += (*gg.begin() + 1 ) / 2 ;
k -= *gg.begin();
hh.insert(*gg.begin());
gg.erase(gg.begin());
}
}
ans = max(ans, a[r - 1 ] - a[l - 1 ]);
if (hh.find(t[l]) != hh.end())
{
hh.erase(hh.find(t[l]));
k += t[l];
}
else
{
gg.erase(gg.find(t[l]));
k += (t[l] + 1 ) / 2 ;
while ((int )gg.size() < w && !hh.empty())
{
k += *(--hh.end());
k -= (*(--hh.end()) + 1 ) / 2 ;
gg.insert(*(--hh.end()));
hh.erase(--hh.end());
}
}
}
printf ("%d" , ans);
return 0 ;
}
小结:
**此类题目较难。**
T5 New Roads
题意:
在给你的几条路中,按要求去几条.
解法:
数列.
代码:
#include <bits/stdc++.h>
using namespace std ;
vector <int > v[200010 ];
int fa[200010 ], gg[200010 ];
int n, t, k, hh = 0 , l;
int main()
{
cin >> n >> t >> k;
l = n - k - t;
for (int i = 1 ; i <= t; i++)
scanf ("%d" , gg + i);
gg[0 ] = 1 ;
if ((gg[t] > k) || (n - t < k) || (n < k))
{
cout << -1 ;
return 0 ;
}
for (int i = 0 ; i <= t; i++)
{
for (int j = 1 ; j <= gg[i]; j++)
v[i].push_back(++hh);
}
for (int i = 0 ; i <= gg[1 ] - 1 ; i++)
fa[v[1 ][i]] = 1 ;
for (int i = 2 ; i <= t; i++)
fa[v[i][0 ]] = v[i - 1 ][0 ];
for (int i = 2 ; i <= t; i++)
{
for (int j = 1 ; j < gg[i]; j++)
{
if (l != 0 && j <= gg[i - 1 ] - 1 )
{
fa[v[i][j]] = v[i - 1 ][j];
l--;
}
else
fa[v[i][j]] = v[i - 1 ][0 ];
}
}
if (l != 0 )
{
cout << -1 ;
return 0 ;
}
cout << n;
for (int i = 2 ; i <= n; i++)
cout << "\n"
<< fa[i] << " " << i;
return 0 ;
}
小结:
**此类题目较难。**