前言
练习了很多场cf都没有好好的总结了,以后还是是不是总结一下每一场出现的问题,无论是解题经验还是解题时的心态问题,都是十分重要的,要避免重复问题出现。
A. Div. 7
题意:改变一个数使得改变次数最少且能被7整除。
解题思路:其实只用改变数字的最后一位就好了。(7,14,21,28,35…)不难发现,每10个数至少有一个可以被7整除。
题解:
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 2e6 + 10;
int main()
{
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
if(n%7==0)
cout << n << endl;
else{
for (int i = 0; i < 10;i++){
n /= 10;
n = n * 10 + i;
if(n%7==0){
cout << n << endl;
break;
}
}
}
}
return 0;
}
B. Minority
题意及解题思路:一串0-1字符串要求删除字串中所有的0或1,且删除的必须是子串中出现次数少的。要求删除的个数最多,不难发现只要是0和1个数不等,就原字符串就是最长的符合要求的字符串。如果0和1相等,就只用个数减去1就好。(需要注意题中涉及不用操作是指字串中0和1相等就不符合条件,并不是指最终的操作为0,除非是个数为0的情况,或者二者相等且为1)
题解:
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 2e6 + 10;
int main()
{
int T;
cin >> T;
while (T--)
{
string s;
cin >> s;
int a = 0, b = 0;
for (int i = 0; i < s.size();i++){
if(s[i]=='0')
a++;
else
b++;
}
if(a==b)
cout << max(a - 1, 0) << endl;
else
cout << min(a, b) << endl;
}
return 0;
}
C. Kill the Monster
题意及思路:怪兽和角色各有血量和武力值,角色有硬币可以加自己的血量和武力值,判断是否可以在被杀之前杀掉怪兽。(特别注意硬币只能加血量或者武力值)直接暴力就可以。
题解:
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 2e6 + 10;
int main()
{
int T;
cin >> T;
while (T--)
{
ll hc, dc, hm, dm;
cin >> hc >> dc >> hm >> dm;
ll k, w, a;
cin >> k >> w >> a;
int flag = 0;
for (int i = 0; i <= k; i++)
{
int j = k - i;
ll t1 = (hc + i * a) / dm, t2 = hm / (dc + j * w);
if ((hc + i * a) % dm)
t1++;
if (hm % (dc + j * w))
t2++;
if (t1 >= t2)
{
flag = 1;
break;
}
}
if (flag)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
D. Make Them Equal
题意:数组a原来都是1,经处理之后使a[i]=b[i],每次操作为a[i]=a[i]+a[i]/x(向下取整)。最终a[i]==b[i],能得到c[i]硬币。在给定操作次数情况下,能得到的最多的硬币为多少。
解题思路:很典型的0-1背包问题,对于c数组为每个物品的价值。对啊、数组先进行操作,将b数组化成需要进行的操作数,再套板子。(开long long 啊!!!)
题解:
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll w[N], dp[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
memset(w, 0x3f3f3f3f, sizeof(w));
w[1] = 0;
for (int i = 1; i <= 1000; i++)
{
for (int j = 1; j <= i; j++)
w[i + i / j] = min(w[i + i / j], w[i] + 1);
}
int T;
cin >> T;
while (T--)
{
int n, k;
cin >> n >> k;
k = min(k, 12 * n);
ll b[N], c[N];
for (int i = 1; i <= n; i++)
{
cin >> b[i];
b[i] = w[b[i]];
}
for (int i = 1; i <= n; i++)
cin >> c[i];
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
{
for (int j = k; j >= b[i]; j--)
{
dp[j] = max(dp[j], dp[j - b[i]] + c[i]);
}
}
cout << dp[k] << endl;
}
return 0;
}
总结
老毛病:1.记得删掉测试freopen
2.记得开long long