T1 k-Factorization
题意:
输入一个数,把他分成b个数,输出.
解法:
暴力.
代码:
#include<bits/stdc++.h>
using namespace std;
int x[10000];
int main()
{
int n,k,a=0;
cin>>n>>k;
while(n!=1)
{
for(int i=2; i<=n; i++)
{
if(n%i==0)
{
a++;
x[a]=i;
n=n/i;
break;
}
}
}
if(a<k)
cout<<-1;
else
{
for(int i=a; i>k; i--)
x[i-1]=x[i-1]*x[i];
for(int i=1; i<=k; i++)
cout<<x[i]<<" ";
}
return 0;
}
小结:
**此类题目水题。**
T2 Odd sum
题意:
输入n个数,输出最大的奇数.
解法:
分类讨论,暴力.
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 1000000
LL x[N],y[N];
int main()
{
int a,b,ji=0,ou=0,h=0,max=-10000;
cin>>a;
for(int i=1; i<=a; i++)
{
cin>>b;
if(b%2!=0)
{
ji++;
x[ji]=b;
}
else
{
ou++;
y[ou]=b;
}
}
sort(x+1,x+ji+1);
sort(y+1,y+ou+1);
for(int i=ji; i>=1; i--)
{
h+=x[i];
if(h%2!=0&&h>max)
max=h;
}
for(int i=ou; i>=1; i--)
if(y[i]>0)
max+=y[i];
cout<<max;
return 0;
}
小结:
**此类题目暴力。**
T3 Minimal string
题意:
把一个字符串经过栈的处理,输出最小值.
解法:
预处理.
代码:
#include<bits/stdc++.h>
#define N 100010
using namespace std;
vector<char> ans;
stack<char> s;
char x[N];
int y[1000];
int main()
{
char a;
int chang=0,o;
while(scanf("%c",&a)==1&&a!=10)
{
chang++;
x[chang]=a;
y[a]++;
}
for(int i=1; i<=chang; i++)
{
s.push(x[i]);
o=0;
y[x[i]]--;
while(!s.empty())
{
for(int j=s.top()-1; j>=97; j--)
{
if(y[j]!=0)
o=1;
}
if(o==1)
break;
else
{
ans.push_back(s.top());
s.pop();
}
}
}
for(int i=0;i<chang;i++)
printf("%c",ans[i]);
return 0;
}
小结:
**此类题目预处理。**
T4 Broken BST
题意:
给每个点的权值,左右孩子,问用BST搜索法有几个数搜索不到。搜索的数为每一个点的权值。
解法:
暴力搜索.
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100020
#define M 1e9
struct node
{
int l, r, v;
} t[N];
int n, kk, cnt;
bool get[N];
map<int, int> mp, vis;
void dfs(int u, int p, int q)
{
if (u == -1)
return;
if (t[u].v >= p && t[u].v <= q&&mp[t[u].v])
mp[t[u].v] = 0;
dfs(t[u].l, p, min(q, t[u].v));
dfs(t[u].r, max(p, t[u].v), q);
}
int main()
{
while (cin >> n)
{
memset(get, true, sizeof(get));
mp.clear();
int num = 0;
for (int i = 1; i <= n; i++)
{
scanf("%d%d%d", &t[i].v, &t[i].l, &t[i].r);
if (t[i].l != -1)
get[t[i].l] = false;
if (t[i].r != -1)
get[t[i].r] = false;
mp[t[i].v]++;
}
cnt = 0;
for (int i = 1; i <= n; i++)
if (get[i])
kk = i;
dfs(kk, -M, M);dfs(kk, -M, M);
for (int i = 1; i <= n; i++)
{
cnt += mp[t[i].v];
mp[t[i].v] = 0;
}
printf("%d\n",cnt);
}
return 0;
}
小结:
**此类题目。**
T5 Array Queries
题意:
自己看,不会讲.
解法:
根据题意写就行了,主要是纯暴力会TLE,所以需要dp一下,大概找个区域,这里取350,大于根号100000就行。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 100000
#define LL long long
pair<LL,LL> gai[N+5];
LL a,b,c;
double yao[N+5];
int main()
{
cin>>a;
for(int i=1; i<=a; i++)
cin>>yao[i];
for(int i=1; i<=a; i++)
{
cin>>b;
yao[i]=b-yao[i];
}
for(int i=2; i<=a; i++)
{
cin>>gai[i].first>>gai[i].second;
}
for(int i=a; i>1; i--)
{
yao[gai[i].first]+=yao[i]>0?1LL*yao[i]*gai[i].second:yao[i];
}
yao[1]>0?cout<<"NO":cout<<"YES";
}
小结:
**此类题目较难。**
T6 Mice and Holes
题意:
有几个老鼠和几个洞,一个洞里可以有指定的老鼠,问这么安排才能使老鼠跑的路最短.
解法:
暴力递归.
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll INF = 0x3f3f3f3f3f3f3f;
const int Max = 5005;
ll mm[Max];
pair<ll, int> h[Max];
ll sum[Max], dp[2][Max];
struct line
{
ll val[Max];
int id[Max], l, r;
void init()
{
l = 0;
r = 0;
}
void push(ll v, int i)
{
while (l < r && v < val[r - 1])
r--;
val[r] = v;
id[r] = i;
r++;
}
ll front()
{
return val[l];
}
void nn(int i)
{
while (l < r && id[l] <= i)
l++;
}
} qq;
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> mm[i];
}
int tot = 0;
for (int i = 1; i <= m; i++)
{
cin >> h[i].first;
cin >> h[i].second;
tot += h[i].second;
}
if (tot < n)
{
cout << -1 << endl;
return 0;
}
sort(mm + 1, mm + n + 1);
sort(h + 1, h + m + 1);
for (int i = 0; i < Max; i++)
{
dp[0][i] = dp[1][i] = INF;
}
int xx = 0, zz = 1;
dp[xx][0] = 0;
dp[zz][0] = 0;
for (int i = 1; i <= m; i++)
{
swap(xx, zz);
for (int j = 1; j <= n; j++)
{
sum[j] = sum[j - 1] + abs(h[i].first - mm[j]);
}
qq.init();
for (int j = 0; j <= n; j++)
{
qq.push(dp[zz][j] - sum[j], j);
dp[xx][j] = qq.front() + sum[j];
qq.nn(j - h[i].second);
}
}
cout << dp[xx][n] << endl;
return 0;
}
小结:
**此类题目难**