广州大学第十八届ACM大学生程序设计竞赛(同步赛)
https://ac.nowcoder.com/acm/contest/77448
一. 能赢吗?会赢的!
取整函数:https://blog.csdn.net/aouixh/article/details/53483556
- ceil(): double向上取整。
- floor():向下取整。
- round():(环绕,取其大约)。四舍五入函数。
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n;
cin>>n;
vector<int>a(n);//保证a[i]不改变。
for(int i=0;i<n;i++){
cin>>a[i];
}
int sum=0;//护盾值的累加。
vector<int>b(n);//每个boss刷新后的护盾值加血量。
vector<int>c(n);//击败每个boss需要的初始战力。
c[0]=a[0];
for(int i=0;i<n;i++)
{
b[i]=a[i];
if(i>0)
{
b[i]+=ceil(a[i-1]/2.0);
sum+=floor(a[i-1]/2.0);
c[i]=b[i]-sum;//新血量-当前增加能力值=初始能力值。
}
}
sort(c.begin(),c.end());
cout<<c[n-1]+1<<endl;//取最大加一
return 0;
}
二. 计算几何
因为保证数据不存在相同坐标的点。所以可以根据点的特征来排序:
- 如果两个点的纵坐标是当前剩余点最小的。那么两个点和其他的点不会相交。
- 如果两个点纵坐标相同,那么横坐标按照从0->∞排序,使每个点都彼此错开。
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool cmp(pair<int,pair<int,int>>a,pair<int,pair<int,int>>b)
{
if(a.second.second!=b.second.second)
return a.second.second<b.second.second;
else
{
return a.second.first>b.second.first;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
vector<pair<int,pair<int,int>>>a(n);
for(int i=0;i<n;i++)
{
cin>>a[i].second.first>>a[i].second.second;
a[i].first=i+1;
}
sort(a.begin(),a.end(),cmp);
if(n%2==0)
{
cout<<n/2<<endl;
for(int i=0;i<n;i+=2)
{
cout<<a[i].first<<" "<<a[i+1].first<<endl;
}
}else
{
cout<<n/2<<endl;
for(int i=0;i<n;i+=2)
{
if(i+1<n)
cout<<a[i].first<<" "<<a[i+1].first<<endl;
}
}
return 0;
}
三. 矩阵最大路径与
^_^
dp动态规划的blog(待完成):https://www.cnblogs.com/miao-jc/p/18092141
//以后会懂的。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
signed main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,m;
cin>>n>>m;
vector<vector<int>>a(n,vector<int>(m));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
int k=a[0][0]&a[n-1][m-1];
vector<vector<int>>st(n,vector<int>(m,0));
vector<int>dx={1,0,-1,0};
vector<int>dy={0,-1,0,1};
auto check=[&](int x)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
st[i][j]=0;
}
}
queue<array<int,2>>q;
q.push({0,0});
while(q.size())
{
auto[xx,yy]=q.front();
q.pop();
if(xx==n-1 and yy==m-1)
return 1;
if(st[xx][yy])
continue;
st[xx][yy]=1;
for(int i=0;i<4;i++)
{
int nx=xx+dx[i],ny=yy+dy[i];
if(nx<0 or nx>=n or ny<0 or ny>=m or st[nx][ny] or (a[nx][ny]&x)!=x)
continue;
q.push({nx,ny});
}
}
return 0;
};
int res=0;
for(int i=30;i>=0;i--)
{
if(!(k>>i&1))
continue;
int t=res+(1<<i);
bool flag =check(t);
if(flag)
res+=(1<<i);
}
cout<<res;
return 0;
}
牛客周赛 Round 36
https://ac.nowcoder.com/acm/contest/76609
小红走矩阵
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int minstep(vector<vector<char>>&mm,int n,int m)
{
vector<vector<int>>step(n,vector<int>(m,-1));
vector<int>dx={0,0,1,-1};
vector<int>dy={1,-1,0,0};
queue<pair<int,int>>q;
step[0][0]=0;
q.push({0,0});
while(!q.empty())
{
pair<int,int>cur=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=cur.first+dx[i];
int y=cur.second+dy[i];
if(x>=0&&x<n&&y<m&&mm[x][y]!=mm[cur.first][cur.second]&&step[x][y]==-1)
{
step[x][y]=step[cur.first][cur.second]+1;
//走到下一个格子的步数等于上一个格子数加一。
q.push({x,y});
//把可以走到的格子装到队列里
}
}
}
return step[n-1][m-1];
}
signed main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,m;
cin>>n>>m;
vector<vector<char>>mm(n,vector<char>(m));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>mm[i][j];
}
}
int r=minstep(mm,n,m);
if(r==-1)
{
cout<<"-1"<<endl;
//初始化为-1,如果是-1的话就没有走到。
}else
{
cout<<r<<endl;
}
return 0;
}
天梯赛训练
https://vjudge.net/contest/617184#problem/H
P1098 [NOIP2007 提高组] 字符串的展开
https://www.luogu.com.cn/problem/P1098
1、s.erase(x,y) :表示将字符串s从x位置起删除y个字符
2、s.insert(x,y) :表示将字符串y(或字符y)插入到s的x位置处
3、s.push_back(x) :表示在s的末尾插入字符x
4、reverse(s.begin(),s.end()) :将字符串s翻转
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int a,b,c;
cin>>a>>b>>c;
string s,t;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]!='-')cout<<s[i];
else
{
auto l=s[i-1],r=s[i+1];
if('0'<=l and l<='9' and '0'<=r and r<='9')
{
if(l>=r)
{
cout<<'-';
continue;
}
t="";
for(l++;l<r;l++)
{
for(int j=0;j<b;j++)
{
if(a<=2)
t+=l;
else
t+='*';
}
}if(c==2)
{
reverse(t.begin(),t.end());
}
cout<<t;
}else if('a'<=l and l<='z' and 'a'<=r and r<='z')
{
if(l>=r)
{
cout<<'-';
continue;
}
t="";
for(l++;l<r;l++)
{
for(int j=0;j<b;j++)
{
if(a==1)
t+=l;
else if(a==2)
{
t+=l+'A'-'a';
}else
{
t+='*';
}
}
}
if(c==2)
reverse(t.begin(),t.end());
cout<<t;
}else{
cout<<"-";
}
}
}
return 0;
}
P2058 [NOIP2016 普及组] 海港
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,t,m,x;
int nation[1000005];
int sum;
struct node
{
int s,t;//只要开个结构体存人头数
};
queue<node>ship;
node h;
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t>>m;
while(!ship.empty())//只要还有人就对队列进行检查
{
h=ship.front();//循环取队头(由于时间是单调递增的)
if(h.t+86400<=t)//如果在时间外(不符合条件),则对答案和队列进行更新(删减)
{
nation[h.s]--;//这个国籍人数总数减1(因为这不是24小时内的人)
if(nation[h.s]==0)
{
sum--;//如果这个国籍没有人了,则答案数减1(之前记过)
}
ship.pop();
continue;//因为是单调递增的,所以有可能还会有,继续去找
}
break;//如果现在这个在24小时内,后面的肯定也符合条件,直接退出
}
for(int j=1;j<=m;j++)
{
cin>>x;
h.s=x,h.t=t;
ship.push(h);
nation[x]++;//这个国籍的人加1
if(nation[x]==1)
sum++;//如果这个国籍是1,相对第一次出现,那么就算上他
}
cout<<sum<<endl;
}
return 0;
}
四川农业大学新生选拔赛
【模板】01背包
https://blog.csdn.net/kingxzq/article/details/136465242
你有一个背包,最多能容纳的体积是V。
现在有n个物品,第i个物品的体积为vi,价值为wi。
(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品?
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF -999999
const int N=1e5+10;
int dp[1005],v[1005],w[1005];
signed main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,V;
cin>>n>>V;//物品个数,背包体积。
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];//体积,价值
}
for(int i=1;i<=n;i++)
{
for(int j=V;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
cout<<dp[V]<<endl;
memset(dp,-0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
for(int j=V;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
}
}
if(dp[V]<0)
dp[V]=0;
cout<<dp[V]<<endl;
return 0;
}
取石子游戏 1
关键就是何时石子数目达到 x(k+1),其中x为任意整数,从这一刻起,无论这一刻以后首个拿石子的人(注意:“这一刻以后”为定语,这个人不一定是整个游戏首个拿石子的人)拿几个石子,另一位聪明的玩家一定会保证二者所拿石子数之和为k+1来保证他自己赢。
故对于整个游戏的先手来说,他一定要在游戏开始石子数为 x(k+1)+s,s<k 时拿走s个石子来取胜,而如果开始时石子数便为x(k+1),只要对手足够聪明他就必输。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
signed main()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
int n,k;
cin>>n>>k;
if(n%(k+1)!=0)
{
cout<<"1"<<endl;
}else
{
cout<<"2"<<endl;
}
return 0;
}
P4391 [BOI2009] Radio Transmission 无线传输
https://www.luogu.com.cn/problem/P4391
KMP算法????????????
标签:24,2024.3,cout,int,cin,long,vector,tie From: https://www.cnblogs.com/miao-jc/p/18092073