A题
A题自己没推出来题解上的规律,勉强看懂题解的推导后自己做了一遍,刚开始报错自己以为是INF自己设置的数据太大了,就改小了1000倍,后来发现不是那但忘了改回去,导致后来又因为INF设置的太小报错。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll N = 5 * 1e5 + 10;
const ll INF = 922337203685477;
ll n, t, z, ni, cnt, sum;
ll a[N];
int main(){
cin >> t;
while (t --){
sum = 0, z = 0, ni = 0, cnt = INF;
scanf("%lld", &n);
for (ll i = 1; i <= n; i ++){
scanf("%lld", &a[i]);
sum += a[i];
z += i * a[i];
ni += (n - i + 1) * a[i];
}
for (ll i = n; i >= 1; i --){
z += sum - n * a[i];
cnt = min(cnt, z);
}
for (ll i = 1; i <= n; i ++){
ni += sum - n * a[i];
cnt = min(cnt, ni);
}
cout << cnt << endl;
}
}
C题
自己就很奇怪,刚开始自己用pyhton模拟为啥一直超时,自己python改成用三维列表后却答案错误。自己在这个题之后也学习到了一点,就是在程序中使用函数可以使代码自己修改起来简单很多。在补这道题时自己遇到了问题,编程半小时修改俩小时,最后也是成功改出来了。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
int n, m, cnt;
int a[110][110];//变化的
int mid[110][110];//计数的
int beg[110][110];//最初的
int dx[] = {-1, -1, -1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1, -1, 1, -1, 0, 1};
bool check(){
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++)
if (beg[i][j] != a[i][j])
return false;
return true;
}
void solve(){
memset(mid, 0, sizeof(mid));
//查看周围八个点
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++){
if (a[i][j])
for (int p = 0; p < 8; p ++){
//防止出现负数下标
int x = (i + dx[p]+ n) % n,
y = (j + dy[p] + n) % n;
mid[x][y]++;
}
}
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++)
if (mid[i][j] == 3)
a[i][j] = 1;
else if (mid[i][j] < 2 || mid[i][j] > 3)
a[i][j] = 0;
}
int main(){
int t;
cin >> t;
while (t --){
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i ++)
for (int j = 0; j < n; j ++){
scanf("%d", &beg[i][j]);
a[i][j] = beg[i][j];
}
cnt = 0;
solve();
cnt++;
while (!check() && m--){
solve();
cnt++;
if (m == 0) break;
}
// cout << m;
if (m)
cout << "YES" << endl
<< cnt << endl;
else
cout << "NO" << endl;
}
}
F题
这个题刚开始自己没看清子序列的定义,以为必须连在一起才是子序列,直接在原序列里查找“FeiMa”,后来自己看到那个定义后自己就换了个思路,先找F,在F后找e,再这样找,找到a后cnt加一,就过了。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
bool judge(string str){
int a = str.find("F");
if (a != -1)
return true;
else
return false;
}
int main(){
int t;
cin >> t;
while (t --){
string str;
int n;
cin >> n;
getchar();
getline(cin, str);
int cnt = 0;
int e = 0;
while(judge(str)){
int a = str.find("F", e);
int b = str.find("e", a);
if (b == -1)
break;
int c = str.find("i", b);
if (c == -1)
break;
int d = str.find("M", c);
if (d == -1)
break;
e = str.find("a", d);
if (e == -1)
break;
str[a] = 't';
str[b] = 't';
str[c] = 't';
str[d] = 't';
str[e] = 't';
cnt++;
}
cout << cnt << endl;
}
}
H题
签到题,自己由于没看到x > 1的限制条件爆了一次wa
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
int t;
cin >> t;
while (t --){
int n;
cin >> n;
// int j = n % 2;
// if (j == 1)
// cout << n / 2 + 1 << endl;
// else
if (n >= 2)
cout << n / 2 << endl;
else
cout << -1 << endl;
}
}