代码1111
2025-10-30 19:10:51
发布于:广东
14阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;//部分数据为1e14,并且剩余菜量也容易超出int范围,直接全开long long
const int MAXN=1e5+5;//数组大小
int n;
ll t;
struct E{
ll v;//能买的菜量
ll d;//进货天数
}a[MAXN];
int main(){
freopen("Dinner.in","r",stdin);
freopen("Dinner.out","w",stdout);
cin>>n>>t;
for(int i=1;i<=n;i++){
cin>>a[i].d>>a[i].v;//读入数据
}
ll ans=0;//答案
ll res=0;//此时家里剩余菜量
a[n+1].d=t+1;//计算最后一次进货能不能吃到第t天,+1是因为第t天也要计算在内
a[n+1].v=0; //这一天不会进货
for(int i=1;i<=n;i++){
res+=a[i].v;//新买到的菜加入剩余菜量
ans+=min(res,a[i+1].d-a[i].d);//剩余的够不够两次进货中间的天数吃,取最小值
res-=min(res,a[i+1].d-a[i].d);//把吃掉的减去
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long int ll;
const int MAXN=105;
int n,T;
ll tc,tm;
ll a[MAXN],b[MAXN],c[MAXN];
bool check(ll mid){
ll maxn=min(tc-1,mid),minn=max(0ll,mid-tm+1);//设置初值
for(int i=1;i<=n;i++){
ll k=c[i]-a[i]*tc-b[i]*tm+b[i]*mid;//k值
if(b[i]-a[i]==0&&k<0) return 0;//分类讨论
else if(b[i]-a[i]>0) maxn=min(maxn,(ll)floor((double)k/(b[i]-a[i])));//注意更新时需要和原值比较
else if(b[i]-a[i]<0) minn=max(minn,(ll)ceil((double)k/(b[i]-a[i])));
}
return minn<=maxn;//判断是否有解
}
int main(){
freopen("bin.in","r",stdin);
freopen("bin.out","w",stdout);
cin>>T;
while(T--){//T组输入
ll ans=-1;//答案
cin>>n>>tc>>tm;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
if(check(0)){//判断不花钱的情况
cout<<0;
continue;
}
ll l=1,r=tc+tm-2;//二分答案框架
while(l<=r){
ll mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}
else{
l=mid+1;
}
}
cout<<ans<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 2e5 + 5;
string s;
int sum[N];
int q;
int main(){
freopen("String.in","r",stdin);
freopen("String.out","w",stdout);
cin >> s;
s = " " + s;
sum[1] = (s[1] == 'C' ? 1 : (s[1] == 'O' ? 2 : 3));
for(int i = 2; i < s.size(); i++){
int current = (s[i] == 'C' ? 1 : (s[i] == 'O' ? 2 : 3));
sum[i] = (sum[i - 1] ^ current);
}
cin >> q;
while(q--){
int l, r;
cin >> l >> r; // 输入查询区间[l, r]
cout << ((sum[l - 1] ^ sum[r]) == 1 ? 'Y' : 'N');
}
fclose(stdin);
fclose(stdout);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
int c,r,d,s;
};
edge e[200100];
int a[200100];//停泊时间
int dis[200100];//dis[i]表示起点到达点i的最早时间
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>e[i].c>>e[i].r>>e[i].d>>e[i].s;
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(dis,0x3f,sizeof(dis));//将到达所有城市的时间初始化为极大值
dis[1]=0; //到达起点的时间为0
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int c=e[j].c,r=e[j].r,d=e[j].d,s=e[j].s;
int wait=0;
if(c!=1) wait=a[c];//计算停泊时间,起点1不用停泊
if(dis[c]+wait>r) continue;//如果不能进入飞机,则跳过
if(dis[d]>s) dis[d]=s;//更新到达城市d的时间
}
}
for(int i=1;i<=n;i++){
if(dis[i]==dis[0]) cout<<-1<<endl;
else cout<<dis[i]<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
int c,r,d,s;
};
vector<edge> ve[200100];//邻接表存图,ve[x]存的是所有从x出发的航线
int a[200100];//停泊时间
int dis[200100];//dis[i]表示起点到达点i的最早时间
void dfs(int x){//当前搜索点x
for(int i=0;i<ve[x].size();i++){
int y=ve[x][i].d,r=ve[x][i].r,s=ve[x][i].s;
int wait=0;
if(x!=1) wait=a[x];//x==1时在起点位置,不需要停泊
if(dis[x]+wait<=r&&dis[y]>s){
dis[y]=s;
dfs(y);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int c,r,d,s;
cin>>c>>r>>d>>s;
ve[c].push_back({c,r,d,s});//存图
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(dis,0x3f,sizeof(dis));//将所有dis初始化为极大值
dis[1]=0;//0时刻就在城市1
dfs(1);
for(int i=1;i<=n;i++){//for循环输出到达时间
if(dis[i]==dis[0]) cout<<-1<<endl;//无法到达输出-1
else cout<<dis[i]<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct edge{
int c,r,d,s,id;//航线编号
};
bool cmp(edge a,edge b){
return a.r>b.r;
}
vector<edge> ve[200100];
int a[200100];//停泊时间
int dis[200100];//dis[i]表示起点到达点i的最早时间
int start[200100];//标记每个点从哪条航线开始搜索
bool vis[200100];
void dfs(int x){//当前搜索点x
int t = dis[x];//上一个超时原因,搜索到x的时候回头算了
for(int i=0;i<ve[x].size();i++){//for(int i=start[x];i<ve[x].size();i++){
int y=ve[x][i].d,r=ve[x][i].r,s=ve[x][i].s,id=ve[x][i].id;
int wait=0;
if(x!=1) wait=a[x];//x==1时在起点位置,不需要停泊
if(t+wait>r) break;
if(t+wait<=r&&dis[y]>s){
//可以在规定时间前进入飞机 并且 到达城市y的时间更早
vis[id]=1;
dis[y]=s;
dfs(y);
}
}
}
int main(){
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int c,r,d,s;
cin>>c>>r>>d>>s;
ve[c].push_back((edge){c,r,d,s,i});//存图
}
for(int i=1;i<=n;i++){
cin>>a[i];
sort(ve[i].begin(),ve[i].end(),cmp);
}
memset(dis,0x3f,sizeof(dis));//将所有dis初始化为极大值
dis[1]=0;//0时刻就在城市1
dfs(1);
for(int i=1;i<=n;i++){//for循环输出到达时间
if(dis[i]==dis[0]) cout<<-1<<endl;//无法到达输出-1
else cout<<dis[i]<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
这里空空如也


有帮助,赞一个