输入包含多组测试数据。
每组第一行输入两个数,分别为n,m。接下来有n行,每行三个数分别为a,b,k。
输出相应的结果表示能否满足订购要求。
5 10 4 10 9 8 12 2 8 12 1 14 20 8 30 300 15
1 0 1 1 0
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <queue>
#include <string>
#include <map>
using namespace std;
struct P {
int starttime, endtime, peoplenum;
bool operator<(const P& x)const {
return endtime > x.endtime;
}
};
int main()
{
int people, remain;
while (scanf("%d%d", &people, &remain) != EOF) {
vector<int>result;
priority_queue<P>que;
while (people--) {
P temp;
scanf("%d%d%d", &temp.starttime, &temp.endtime, &temp.peoplenum);
//cin >> temp.starttime >> temp.endtime >> temp.peoplenum;
if (temp.peoplenum <= remain) {
que.push(temp);
remain -= temp.peoplenum;
result.push_back(1);
}
else if (!que.empty()) {
P tag = que.top();
while (!que.empty() && tag.endtime <= temp.starttime) {
remain += tag.peoplenum;
que.pop();
if (!que.empty()) {
tag = que.top();
}
}
if (temp.peoplenum <= remain) {
que.push(temp);
remain -= temp.peoplenum;
result.push_back(1);
}
else
result.push_back(0);
}
else
result.push_back(0);
}
for (int i : result)
printf("%d\n", i);
}
}
while True: try: n,m=map(int,input().split()) mtx=[] for i in range(n): l=list(map(int,input().split())) mtx.append(l) a,b,sum=0,0,0 for i in range(n): flg=0 tmp0,tmp1,tmp2=mtx[i][0],mtx[i][1],mtx[i][2] if tmp0<b: if (sum+tmp2)<=m: sum,flg,a,b=sum+tmp2,1,tmp0,max(b,tmp1) else: if tmp2<=m: sum,flg,a,b=tmp2,1,tmp0,tmp1 print(flg) except: break
#include <stdio.h>
(737)#include <string.h>
#include <queue>
(789)#include <vector>
#include <iostream>
(720)#include <algorithm>
#include <stack>
(850)#include <list>
#include <map>
(747)#include <math.h>
using namespace std;
#define MIN -0x7fffffff
(3237)#define MAX 0x7fffffff
//这一题我的思路是把每个购票信息分成一个个的时间节点。这样,一条信息我们就可以拆分为两条信
//息,也就是两个时间节点。一个上车信息,一个下车信息。同时为了在下车时对应其上车时的购票
//数,我又用ID来唯一标识每一个购票记录。
//存储时间节点信息
struct Time_Node{
int id; // 标识唯一的购票记录
int time; // 时间点
int flag; // 时间点类型,1表示上车,-1表示下车
int ticket_sum; // 票数
bool operator < (const Time_Node &A) const{ // 按照时间顺序依次进行,且在同一时间点下车在上
//车后
if(time != A.time)
return time < A.time;
else
return flag < A.flag;
}
}sample[10001]; // 题目有点坑,N的值非常大,所以我把数组开到1000001
vector<int> q; // 存储成功上车的ID标识符
vector<int>::iterator it;
int size;
int main(){
int n,m;
while(scanf("%d%d",&n,&m) != EOF){
int a,b,k;
size = 0;
while(!q.empty())
q.pop_back();
for(int i=0;i<n;i++){
scanf("%d%d%d",&a,&b,&k);
// 上车信息
sample[size].id = i;
sample[size].time = a;
sample[size].flag = 1;
sample[size++].ticket_sum = k;
// 下车信息
sample[size].id = i;
sample[size].time = b;
sample[size].flag = -1;
sample[size++].ticket_sum = k;
}
//printf("size=%d\n", size);
sort(sample,sample+size); // 排序
int currentTime = 0; // 当前时间
int currentTicket = 0; // 当前已购票数
for(int i=0;i<size;i++){
if(sample[i].flag == 1){ // 若是上车节点信息
if(currentTicket + sample[i].ticket_sum <= m){ // 还能上车
q.push_back(sample[i].id);
currentTicket += sample[i].ticket_sum;
printf("1\n");
}
else{
printf("0\n");
}
}
else{ // 若是下车信息
for(it=q.begin();it!=q.end();it++){
if(*it == sample[i].id){ // 若此下车信息是之前上车信息中所记录的
currentTicket -= sample[i].ticket_sum;
q.erase(it); // 消除此上车记录
break;
}
}
}
//printf("currentTicket=%d\n", currentTicket);
}
}
return 0;
} #include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//这一题的意思就是,中间站有人订票但是这时这个站火车上已经有人,且总人数大于最大载客人数,则返回0。
bool solve(int m,int k,vector<int>&ans,int a,int b){
if(k>m)return false;
for(int i=a;i<b;i++)
if((ans[i]+k)>m)
return false;
return true;
}
int main(){
int n,m,a,b,k;
cin>>n>>m;
vector<int>ans(10086,0);
while(n--){
cin>>a>>b>>k;
/*for(int i=a;i<b;i++){
ans[i]+=k;
}*///注意只有满足条件的,才进行for循环的操作
if(solve(m,k,ans,a,b)==false)
cout<<"0"<<endl;
else{
for(int i=a;i<b;i++)
ans[i]+=k;
cout<<"1"<<endl;
}
}
return 0;
} #include<iostream>
using namespace std;
#define MAX 1000
int num[MAX];
bool isFull(int a,int b,int k,int m){
if(k>m)return true;
for(int i=a;i<b;i++){
if((num[i]+k)>m)return true;
}
return false;
}
int main(){
int m,n,a,b,k;
while(cin>>n>>m){
for(int i=0;i<MAX;i++)num[i]=0;
for(int i=0;i<n;i++){
cin>>a>>b>>k;
if(isFull(a,b,k,m))cout<<"0\n";
else{
for(int j=a;j<b;j++)num[j]+=k;
cout<<"1\n";
}
}
}
return 0;
}
发生段错误或数组越界。。
#include <iostream>
#include <vector>
using namespace std;
int judge ( int m , vector<int>station ){
for ( int i = 0 ; i < station.size() ; i ++ ){
if ( station[i] > m ){
return 0;
return 1;
}
int main(){
int n , m ;
//cout << "in: ";
while ( cin >> n ){
vector<int>station ( 100, 0 );
cin >> m;
for ( int i = 0 ; i < n ; i++ ){
int a, b, k;
cin >> a >> b >> k;
for ( int p = station.size() ; p < b ; p++ ) {
station.push_back(0);
}
}
for ( int j = a-1 ; j < b ; j++ ){
station[j] += k;
}
cout << judge( m , station ) << endl;
if ( !judge( m , station) ){
for ( int j = a-1 ; j < b ; j++ ){
station[j] -= k;
}
}
}
#include<iostream>
using namespace std;
int main()
{
int N,M;
int b[10000];
while(cin>>N>>M)
{
for(int i=0;i<10000;i++)
b[i]=M;
int a[100][3];
for(int i1=0;i1<N;i1++)
{int x,y,z;
cin>>x>>y>>z;
a[i1][0]=x;
a[i1][1]=y;
a[i1][2]=z;}
for(int i4=0;i4<N;i4++)
{int flag=0;
for(int i2=a[i4][0]+1;i2<a[i4][1];i2++)
if(a[i4][2]>b[i2]) {flag=1;break;}
if(flag==1) cout<<'0'<<endl;
else if(flag==0) {for(int i3=a[i4][0]+1;i3<a[i4][1];i3++) b[i3]=b[i3]-a[i4][2];cout<<'1'<<endl;}
}
}
return 0;
}