寒假6 cpp
A
数据范围
打表
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t=1;
//cin>>t;
int a[]={2 ,3 ,5, 7, 11 ,13 };
set<int>st;
for(int i=0;i<6;i++)
{
for(int j=i+1;j<6;j++)
{
for(int k=j+1;k<6;k++)
{
st.insert(a[i]*a[j]*a[k]);
}
}
}
while(t--)
{
int l,r;
int flag=1;
cin>>l>>r;
for(int i=l;i<=r;i++)
{
if(st.find(i)!=st.end())
{
cout<<i<<endl;
flag=0;
break;
}
}
if(flag)cout<<-1<<endl;
}
}
B
二分查找最小 更新 idx和location的值 然后swap (有人没更新minn wa了...)
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t=1;
//cin>>t;
while(t--)
{
int n;
cin>>n;
vector<int>a(n),b(n);
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)cin>>b[i];
std::sort(a.begin(), a.end());
int minn=INT_MAX;
int location,idx;
for(int i=0;i<n;i++)
{
int p= std::lower_bound(a.begin(), a.end(),b[i])-a.begin();
if(abs(a[p-1]-b[i])<abs(a[p]-b[i]))p--;
if(abs(a[p]-b[i])<minn)
{
location=p;
idx=i;
minn=abs(a[p]-b[i]);
}
if(minn==0)break;
}
swap(a[location],a[idx]);
for(int i=0;i<n;i++)cout<<a[i]<<' ';
cout<<endl;
}
}
C
看数据范围
打表造数据....
当然把斐波那契存一下也行,慢不了多少
用map来存n和idx idx对应一个结构体数组来存相应的斐波那契元素
#include<bits/stdc++.h>
#define int long long
using namespace std;
int fibnacial[]={0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,
514229,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,
433494437,701408733};
struct node
{
int i;
int j;
int k;
};
signed main(){
int q;
cin>>q;
map<int,int>mp;
int cnt=0;
vector<node>p(45*45*45);
for(int i=0;i<45;i++)
{
for(int j=0;j<45;j++)
{
for(int k=0;k<45;k++)
{
mp[fibnacial[i]+fibnacial[j]+fibnacial[k]]=cnt;
p[cnt].i=fibnacial[i];
p[cnt].j=fibnacial[j];
p[cnt].k=fibnacial[k];
cnt++;
}
}
}
while(q--)
{
int n;
cin>>n;
if(mp.find(n)!=mp.end())cout<<p[mp[n]].i<<' '<<p[mp[n]].j<<' '<<p[mp[n]].k<<endl;
else cout<<-1<<endl;
}
}
D
模拟概率
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t=1;
//cin>>t;
while(t--)
{
double p;
cin>>p;
cout<<p*p*(1-p)*(1-p)*(1-p)+p*p*p*(1-p)*(1-p)<<endl;
}
}
E
难绷了
这个BOx x(max)=1e5没看到 以为是个位数......喜提wa1发
模拟题
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int t=1;
//cin>>t;
while(t--)
{
vector<char>p(2);
cin>>p[0]>>p[1];
int op;
cin>>op;
string s;
cin>>s;
int wincount=op/2+1;
int m=op;
int cntr=0,cntp=0;
int flag=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='R')cntr++;
else cntp++;
if(cntr==wincount)
{
cout<<"kou!"<<endl<<i+1<<endl;
flag=1;
break;
}
if(cntp==wincount){
cout<<"yukari!"<<endl<<i+1<<endl;
flag=1;
break;
}
}
if(!flag)cout<<"to be continued."<<endl<<s.size()<<endl;
}
}
I
推公式发现任意一个子矩阵的和都是一段ai的和乘以一段bi的和
转化为寻找sumsub(ai)*sumsub(bi)的最大值
难绷的是有负数 我把最小的也找了() 直接输出几个中的最大的就过了....
#include<bits/stdc++.h>
#define int long long
using namespace std;
int maxsum(vector<int>& a) {
int n = a.size();
int ans=a[0],sum=0;
for (int i=0; i<n; i++){
sum=max(sum+a[i],a[i]);
ans=max(ans,sum);
}
return ans;
}
int minsum(vector<int>& a) {
int n = a.size();
int ans=a[0],sum=0;
for (int i=0; i<n; i++){
sum=min(sum+a[i],a[i]);
ans=min(ans,sum);
}
return ans;
}
signed main(){
int n, m;
cin >> n >> m;
vector<int>a(n),b(m);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
cin >> b[i];
}
int p1=maxsum(a);
int p2=minsum(a);
int q1=maxsum(b);
int q2=minsum(b);
cout<<max({q1*p1,q1*p2,q2*p1,q2*p2})<<endl;
}
J
DFS
将未涂色的节点和该红节点构造和为3的倍数即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n, f[N], a[N];
string s;
vector<vector<int>> e(N), E(N);
vector<int> R;
void dfs(int u = 1, int fa = 0)
{
if (s[u] == 'W') f[u] = f[fa];
for (auto v : e[u])
{
if (v != fa) dfs(v, u);
}
}
void solve()
{
cin >> n >> s;
s = " " + s;
for (int i = 2; i <= n; i ++)
{
int x; cin >> x;
e[x].emplace_back(i);
}
for (int i = 1; i <= n; i ++) f[i] = i, a[i] = 1;
dfs();
for (int i = 1; i <= n; i ++) {
if (f[i] == i) R.emplace_back(i);
E[f[i]].emplace_back(i);
}
for (auto u : R) {
if (E[u].size() == 1) {
cout << -1 << endl;
return;
}
if (E[u].size() & 1) {
for (int i = 0; i < 3; i ++) a[E[u][i]] = 1;
for (int i = 3; i < E[u].size(); i ++) a[E[u][i]] = (i & 1) + 1;
} else {
for (int i = 0; i < E[u].size(); i ++) a[E[u][i]] = (i & 1) + 1;
}
}
for (int i = 1; i <= n; i ++) cout << a[i];
cout << endl;
}
signed main() {
int t=1;
//cin>>t;
while(t--)
{
solve();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律