这两天状态不太好,写的比较少
8.15
牛客
a.签到题
英雄联盟的投降机制,模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int sum1=0,sum2=0;
for(auto c:s) {
if(c=='-') break;
if(c=='Y') sum1++;
if(c=='N') sum2++;
}
if(sum1>=4) cout << 1 << endl;
else if(sum2>=2) cout << -1 << endl;
else cout << 0 << endl;
return 0;
}
h.概率推结论
#include <iostream>
using namespace std;
#define int long long
const int mod = 998244353;
int a, b, tot;
int qmi(int a, int k, int p)
{
int res = 1;
while (k)
{
if (k & 1)
res = res * a % p;
a = a * a % p, k >>= 1;
}
return res;
}
signed main()
{
cin >> a >> b, tot = a + b;
cout << (a * qmi(tot, mod - 2, mod)) % mod << " " << (b * qmi(tot, mod - 2, mod)) % mod << endl;
}
2.round898 div4 2(写牛客写的道心破碎来放松)
虽然送但是还是写太久了,题目给定abc三字母只是乱序,我选择的是先看多少个不在位置上的字母如果0正确,如果二再单独判断交换后是否相等abc。其实实际上只需要判断不在位置上的是不是小于2就行了。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
string s;
cin >> s;
string t="abc";
int wcnt=0;
vector<int> W;
for(int i=0;i<s.size();i++) {
if(s[i]!=t[i])
{
wcnt++;
W.push_back(i);
}
}
bool flag=false;
if(W.size()==2) {
int tt=s[W[0]];
s[W[0]]=s[W[1]];
s[W[1]]=tt;
if(s==t) {
flag=true;
}
}
if(W.size()==0) {
flag=true;
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
B.Good Kid
给越小的数加大,得到的乘积越大(相当于乘以分数的大小更大)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
vector<int> A(n);
for(int i=0;i<n;i++) {
cin >> A[i];
}
sort(A.begin(),A.end());
long long sum=1;
for(int i=0;i<n;i++) {
if(i==0) {
sum*=(A[i]+1);
}else {
sum*=A[i];
}
}
cout << sum << endl;
}
}
我直接暴力判断的,但是码力还是比较差码了挺久。
#include <bits/stdc++.h>
using namespace std;
string S[10];
bool st[15][15];
int main()
{
int t;
cin >> t;
while(t--) {
memset(st,0,sizeof st);
for(int i=0;i<10;i++) {
cin >> S[i];
}
int sum=0;
for(int f=0;f<5;f++) {
for(int i=0;i<10;i++) {
for(int j=0;j<10;j++) {
if(i==f || i==9-f || j==f || j==9-f)
{
if(S[i][j]=='X' && !st[i][j]) {
st[i][j]=true;
sum+=f+1;
}
}
}
}
}
cout << sum << endl;
}
}
贪心变白,从左到右
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
int n,k;
cin >> n >> k;
string S;
cin >> S;
int l=0;
int sum=0;
while(l<S.size()) {
// cout << "l:" << l << " S[l]:" << S[l] << endl;
if(S[l]=='B') {
sum++;
for(int i=l;i<S.size() && i<l+k;i++) {
S[i]='W';
}
l+=k;
}else {
l++;
}
}
cout << sum << endl;
}
}
裸二分,但是因为数据范围是2e9,然后check里面有一个加法导致我如果写一个r=1e16爆了挺多次。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,x;
const int N=2e5+10;
int A[N];
bool check(int u) {
long long sum=0;
for(int i=0;i<n;i++) {
if(A[i]<u) {
sum+=(u-A[i]);
}
}
if(sum<=x) return true;
else return false;
}
signed main()
{
int t;
cin >> t;
while(t--) {
cin >> n >> x;
for(int i=0;i<n;i++) {
cin >> A[i];
}
int l=1,r=1e13;
while(l<r) {
int mid=(l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout << l << endl;
}
}
F.Money Tree
看起来就模拟,写了个queue模拟过样例wa了七八次,又道心破碎,1300的div4题目写不出来,双指针一看好像一目了然,待补充。
G,H 待补
3.div3 13
A.字符是否是“平方”,分类讨论模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
string s;
cin >> s;
if(s.size()<2) {
cout << "NO" << endl;
continue;
}else {
if(s.size()%2) {
cout << "NO" << endl;
continue;
}else {
int mid=s.size()/2;
if(s.substr(0,mid)==s.substr(mid,mid)) {
cout << "YES" << endl;
}else {
cout << "NO" << endl;
}
}
}
}
}
B.想了很久怎么保证不重复而且空间复杂度ok,最后用的map,但是实际上set就行了
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
unordered_map<int,int> Hash;
int n;
cin >> n;
int sum=0;
for(int i=1;i*i<=n;i++) {
Hash[i*i]++;
sum++;
}
for(int i=1;i*i*i<=n;i++) {
if(Hash.count(i*i*i)==0) sum++;
}
cout << sum << endl;
}
}
C.题目比较清晰,就是一个逆向右往左一个个减,处理一下细节就好
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
string ans="";
string a,b;
cin >> a >> b;
int r=b.size()-1;
bool flag=true;
for(int l=a.size()-1;l>=0;l--) {
if(a[l]<=b[r]) {
// cout << "b:" << b[r] << " l:" << a[l] << endl;
ans+=(char)(b[r]-a[l]+'0');
r--;
// cout << "ans:" << ans << endl;
}else {
if(b[r-1]!='1') {
flag=false;
break;
}else {
int t=10+(b[r]-a[l]);
// cout << "t:" << t << endl;
ans+=(char)(t+'0');
// cout << "ans:" << ans << endl;
}
r-=2;
}
}
// cout << r << endl;
// cout << "ans:" << ans << endl;
if(r!=-1) {
for(int i=r;i>=0;i--) {
ans+=b[i];
// cout << b[i] << endl;
}
}
// cout << "ans:" << ans << endl;
int pos=ans.size();
for(int i=ans.size()-1;i>=0;i--) {
if(ans[i]=='0') {
pos--;
}else {
break;
}
}
if(!flag) cout << -1 << endl;
else {
for(int i=pos-1;i>=0;i--) {
cout << ans[i];
}
cout << endl;
}
}
}
D.二分,然后比较新的是用二维维克托动态存防止内存爆,还有怎么check需要仔细思考,m-1个商店,那么必须有一个商店满足两个人,并且每个人都有商店可以满足就成功。
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> room;
bool check(int u) {
vector<bool> st(m);
bool flag=false;
for(int i=0;i<n;i++) {
int cnt=0;
for(int j=0;j<m;j++) {
if(room[i][j]>=u) {
st[j]=true;
cnt++;
}
}
if(cnt>=2) flag=true;
}
if(!flag || m==1) return false;
bool flag2=false;
for(int i=0;i<m;i++) {
if(!st[i]) flag2=true;
}
if(!flag2) return true;
return false;
}
int main()
{
int t;
cin >> t;
while(t--) {
cin >> n >> m;
// cout << "n:" << n << m << endl;
room.assign(n,vector<int>(m));
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin >> room[i][j];
// cout << room[i][j];
}
// cout << endl;
}
int l=1,r=1e9;
while(l<r) {
int mid=(l+r+1)>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout << l << endl;
}
return 0;
}
E.
8.16
A.计数模拟
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
string s;
cin >> s;
if(s.size()%2) {
cout << "NO" << endl;
continue;
}else {
int sum1=0,sum2=0,sum3=0;
for(auto c:s) {
if(c=='A') sum1++;
if(c=='B') sum2++;
if(c=='C') sum3++;
}
// cout << "sum:" << sum1 << " " << sum2 << " " << sum3 << endl;
if(sum2==sum1+sum3) cout << "YES\n";
else cout << "NO\n";
}
}
}
B.选择排序模拟,但是我写的更暴力。。补一下官方题解
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--) {
int n;
cin >> n;
vector<int> A(n),B(n);
for(int i=0;i<n;i++) {
cin >> A[i];
B[i]=A[i];
}
sort(A.begin(),A.end());
// for(int i=0;i<n;i++) {
// cout << A[i] << endl;
// }
// cout << "first\n";
// for(int i=0;i<n;i++) {
// cout << B[i] << " ";
// }
// cout << endl;
vector<int> ans;
int sum=0;
for(int i=0;i<n;i++) {
int t=A[i];
if(B[i]!=t) {
for(int j=i;j<n;j++) {
if(B[j]==t) {
int t=B[j];
for(int z=j;z>=i+1;z--) {
B[z]=B[z-1];
}
B[i]=t;
// for(int i=0;i<n;i++) {
// cout << B[i] << " ";
// }
// cout << endl;
// cout << i+1 << " " << j+1 << " " << j-i << endl;
sum++;
ans.push_back(i+1);
ans.push_back(j+1);
ans.push_back(j-i);
}
}
}
}
cout << sum << endl;
for(int i=0;i<ans.size();i+=3) {
cout << ans[i] << " " << ans[i+1] << " " << ans[i+2] << endl;
}
}
}
C.模拟题,从右下角找符合规则的是否能被染黑
#include <bits/stdc++.h>
using namespace std;
const int N=25;
string room[N];
bool st[N][N];
int n,m,k;
bool check(int x,int y) {
if(x<n && x>=0 && y<m && y>=0) {
return true;
}
return false;
}
int main()
{
int t;
cin >> t;
while(t--) {
memset(st,0,sizeof st);
cin >> n >> m >> k;
for(int i=0;i<n;i++) {
cin >> room[i];
}
for(int i=n-1;i>=0;i--) {
for(int j=m-1;j>=0;j--) {
if(room[i][j]=='*') {
bool flag=false;
for(int t=k;t<=10;t++) {
bool fflag=true;
for(int z=1;z<=t;z++) {
if(check(i-z,j-z) && check(i-z,j+z))
{
if(room[i-z][j-z]=='*' && room[i-z][j+z]=='*') {
}else {
fflag=false;
break;
}
}else {
fflag=false;
break;
}
}
if(fflag)
{
for(int z=1;z<=t;z++) {
if(check(i-z,j-z) && check(i-z,j+z))
{
st[i-z][j-z]=st[i-z][j+z]=true;
flag=true;
}
}
}
}
if(flag) st[i][j]=true;
}
}
}
bool flag=false;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(!st[i][j] && room[i][j]=='*') {
flag=true;
}
}
}
if(!flag) {
cout << "YES" << endl;
}else {
cout << "NO" << endl;
}
}
}
D.
E.
F.
明天主要是补题,感觉写的题已经挺多了,除了数学其他1200以下的题目基本是一眼,1200以上1600以下的的div3要么是数学要么是模拟,模拟我一般都能时间堆出来,但是数学题我真的很烂,补完题后板刷一下数学的题