A、签到题
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<iostream>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
typedef struct{
int val, id;
} A;
A a[110];
vector<int> ans;
bool cmp(A x, A y){
return x.val < y.val;
}
int main(){
int n, sum = 0, sum2 = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d", &a[i].val);
a[i].id = i;
sum += a[i].val;
}
sort(a + 2, a + 1 + n, cmp);
for (int i = 2; i <= n && a[i].val <= a[1].val / 2; i++){
ans.push_back(a[i].id);
sum2 += a[i].val;
}
sum2 += a[1].val;
if(sum2 <= sum - sum2)
printf("0");
else{
ans.push_back(1);
sort(ans.begin(), ans.end());
printf("%d\n", ans.size());
for (int i = 0; i < ans.size(); i++) printf("%d ", ans[i]);
}
return 0;
}
B、注意要开long long
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<char, int> P;
P v[1000010];
char s[1000010];
ll sum[1000010];
int v_sz = 0;
int main(){
scanf("%s", s);
int len = strlen(s);
s[len] = 'o';
len++;
int last_v = -1, last_o = 0;
for (int i = 0; i < len; i++){
if(s[i] == 'o'){
if(last_v > 0) v[v_sz++] = make_pair('v', last_v);
last_v = -1;
last_o++;
}
if(s[i] == 'v'){
if(last_v == -1) last_v = 0;
else if(last_v == 0){
last_v = 1;
v[v_sz++] = make_pair('o', last_o);
last_o = 0;
}
else last_v++;
}
}
for (int i = 0; i < v_sz; i++){
P u = v[i];
if(u.first == 'v'){
if(i - 2 >= 0) sum[i] = sum[i - 2] + u.second;
else sum[i] = u.second;
}
else sum[i] = 0 - u.second;
}
int sz = v_sz - 1;
if(v[sz].first == 'o') sz--;
ll ans = 0;
for (int i = 1; i < sz; i++)
if(sum[i] < 0) ans -= sum[i] * sum[i - 1] * (sum[sz] - sum[i - 1]);
printf("%lld", ans);
return 0;
}
C、实际上就是求2^(w + h),快速幂。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
static const int Mod = 998244353;
ll quickpoww(ll base, int n){
ll ans = 1;
while(n){
if(n & 1)
ans = (ans * base) % Mod;
base = (base * base) % Mod;
n >>= 1;
}
return ans;
}
int main(){
int w, h;
cin >> w >> h;
cout << quickpoww(2, (w + h));
return 0;
}
D、看起来是一道很难的图论,实际上瞎搞就行。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<vector>
#include<queue>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
bool is_prime(int x){
for(int i = 2; i <= sqrt(x); i++)
if(x % i == 0) return false;
return true;
}
int main(){
int n, ans;
cin >> n;
ans = n;
while(!is_prime(ans)) ans++;
cout << ans << endl;
for(int i = 1; i < n; i++) cout << i << " " << i + 1 << endl;
cout << 1 << " " << n << endl;
for(int i = 1; i <= ans - n; i++) cout << i << " " << n - i << endl;
return 0;
}
E、注意题目有说只有abc三个字符且不会连续出现一样的字母,这样的话s[l],s[l+1]与s[r],s[r-1]必然有一对相同,不可能出现“INPOSSIBLE”。最后注意边界条件。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<vector>
#include<queue>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
char s[1000010], ans[1000010];
int main(){
int l, r, cnt = 0;
scanf("%s", s);
l = 0, r = strlen(s) - 1;
while(l < r - 2){
if(s[l] == s[r]) ans[cnt++] = s[l], l++, r--;
else if(s[l] == s[r - 1]) ans[cnt++] = s[l], l++, r-=2;
else if(s[l+1] == s[r]) ans[cnt++] = s[l+1], l+=2, r--;
else if(s[l+1] == s[r-1]) ans[cnt++] = s[l+1], l+=2, r-=2;
}
for(int i = 0; i < cnt; i++) printf("%c", ans[i]);
printf("%c", s[l]);
for(int i = cnt - 1; i >= 0; i--) printf("%c", ans[i]);
return 0;
}
剩下的题有时间再补……