http://acm.nyist.net/JudgeOnline/problem.php?pid=168
#include<bits/stdc++.h>
using namespace std;
int dp[200];
int main()
{
int n,t,i,j,ans;
scanf("%d",&t);
while(t--)
{
int a,b,c;
memset(dp,0,sizeof(dp));
ans=-1;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d%d%d",&a,&b,&c),dp[b]+=a,dp[c+b]-=a;
for(i=1;i<200;i++) dp[i]+=dp[i-1],ans=max(dp[i],ans);
printf("%d\n",ans);
}
return 0;
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=169
#include <stdio.h>
int su(int m)
{
int j;
for(j=2;j*j<=m;j++)
if(m%j==0) return 0; //0代表是不素数
return 1;
}
int main()
{
int n,m;
int x,y;
scanf("%d",&n);
while(n--)
{
x=0;y=0;
scanf("%d",&m);
if(m==1) printf("2\n");
else{
if(su(m)) printf("%d\n",m);
else{
x=m-1;
while(!su(x)) {--x;}
y=m+1;
while(!su(y)) {++y;}
if(m-x<y-m) printf("%d\n",x);
else printf("%d\n",y);
}
}
}
return 0;
}
#include<stdio.h>
int main()
{
int a[1010]= {1,1};
int i,j;
for(i=2; i<32; i++)
{
if(a[i]==0)
for(j=i*i; j<1010; j+=i)
a[j]=1;
}
int N;
scanf("%d",&N);
while(N--)
{
int n;
scanf("%d",&n);
for(i=n; a[i]==1; i--);
for(j=n; a[j]==1; j++);
if((j-n)<=(n-i))
printf("%d\n",j);
else
printf("%d\n",i);
}
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=170
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int du[10002];
int main()
{
int k,m,a,b;
while(cin>>m)
{
k=(--m);
memset(du,0,sizeof(du));
while(k--)
{
cin>>a>>b;
du[a]++;
du[b]++;
}
cout<<(count(du,du+m+2,1)+1)/2<<endl;
}
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=171
#include<iostream>
using namespace std;
int f[22][22];
int main()
{
int n,m,c;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
cin>>c;
f[i][j]=max(f[i][j-1],f[i-1][j])+c;
}
cout<<f[m][n]<<endl;
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=247
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define N 100005
int a[N],b[N],head1[N],head2[N],e;
struct node
{
int v,next;
}bian[N*5];
void add(int u,int v)
{
bian[e].v=v;
bian[e].next=head1[u];
head1[u]=e++;
bian[e].v=u;
bian[e].next=head2[v];
head2[v]=e++;
}
int spfa(int s,int n)
{
queue<int>q;
int x,i,v;
int mark1[N],mark2[N];
memset(mark1,0,sizeof(mark1));
memset(mark2,0,sizeof(mark2));
mark1[s]=1;
mark2[n]=1;
q.push(s);
while(!q.empty())
{
x=q.front();
q.pop();
for(i=head1[x];i!=-1;i=bian[i].next)
{
v=bian[i].v;
a[v]=min(a[v],a[x]);
if(!mark1[v])
{
mark1[v]=1;
q.push(v);
}
}
}
q.push(n);
while(!q.empty()) //从终点原路返回起点,即走反向边
{
x=q.front();
q.pop();
for(i=head2[x];i!=-1;i=bian[i].next)
{
v=bian[i].v;
b[v]=max(b[v],b[x]);
if(!mark2[v])
{
mark2[v]=1;
q.push(v);
}
}
}
int ans=0;
for(i=1;i<=n;i++)
{
if(mark1[i]&&mark2[i])
{
ans=max(ans,b[i]-a[i]);
}
}
return ans;
}
int main()
{
int n,m,u,v,x,i;
while(scanf("%d%d",&n,&m)!=-1)
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i]; //a[i]记录最小值,b[i]记录最大值
}
memset(head1,-1,sizeof(head1));
memset(head2,-1,sizeof(head2));
e=0;
while(m--)
{
scanf("%d%d%d",&u,&v,&x);
add(u,v);
if(x==2)
add(v,u);
}
printf("%d\n",spfa(1,n));
}
return 0;
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=248
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+7;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
struct node
{
int v;
int x,f,c;
};node g[N];
bool cmp(node x,node y)
{
return x.v<y.v;
}
int main()
{
int i,j,k,m,n,ans,t,e;
scanf("%d",&t);
while(t--)
{
int a,b,c;
cin>>k>>e>>n;
for(i=0;i<n;i++) cin>>g[i].x>>g[i].f>>g[i].c,g[i].v=g[i].c+e-g[i].x;
sort(g,g+n,cmp);
i=0,ans=0;
while(k)
{
if(k>g[i].f) ans+=g[i].v*g[i].f,k-=g[i].f;
else if(k<=g[i].f) ans+=g[i].v*k,k=0;
i++;
}
cout<<ans<<endl;
}
return 0;
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=250
未AC
#include<bits/stdc++.h>
using namespace std;
const int N=5*1e3+7;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
int f[N];
void write(int a,int b)
{
for(int i=a;i<=b;i++) f[i]=1;
}
void xie(int a,int b)
{
for(int i=a;i<=b;i++) f[i]=0;
}
int main()
{
int i,j,k,m,n,ans;
while(~scanf("%d%d",&m,&n))
{
memset(f,0,sizeof(f));
int a,b,c;
while(n--)
{
ans=0;
//for(i=1;i<=m;i++) cout<<f[i]<<" ";cout<<endl;
cin>>a;
if(a==1)
{
cin>>b;
for(i=1;i<=m;i++)
{
if(f[i]==0) ans++;
else ans=0;
if(ans==b) break;
}
if(i>m) cout<<"0"<<endl;
else cout<<i-b+1<<endl,write(i-b+1,i);
}
else{cin>>b>>c;xie(b,b+c-1);}
}
}
return 0;
}
(看的)
/*
Name:
Copyright:
Author:
Date: 28/04/13 21:55
Description:
刚开始做这道题的时候,第一感觉用线段树应该很容易实现,结果发现我没做过此类的线段树题目
然后上网看了别人的代码,才了有点思路,现总结如下:
这道题题意就是旅馆订房问题,由于牵扯到某一段区间的查找与运算,所以选择了线段树求解,
用free表示此段区间房间是否可用,lmax代表这段区间从左边起最长空闲房间数,rmax表示这段区间
从右边起最长空闲房间数,tmax表示整个区间上的最长连续空闲房间数,查找连续空房间数时,过程如下:
1、如果1~n区间的tmax值都比待查长度len小,就无解,否则有解执行2
2、假如区间lmax是否大于等于len,直接返回l ,否则执行3
3、对于每一个区间,如果它的左儿子的tmax值大于等于len,到左儿子里去找。否则执行4
4、如果左儿子的rmax加上有儿子的lmax大于等于len,直接返回左儿子的右端点减去左儿子的rmax值。
5、否则到右儿子里去找。
PS:对于上述过程,如果满足前面的条件,则不再考虑后面的情况。
更新的时候既进行下压操作,在对某段区间进行处理后(清空房间或占用房间)后,进行更新父节点,
细节看注释!!
*/
#include<iostream>
#include<cstdio>
const int N=50010;
using namespace std;
struct Node{
int l,r;
int free;
int lmax,rmax,tmax;
}tree[3*N];
int build(int l,int r,int i){
tree[i].l=l;
tree[i].r=r;
tree[i].lmax=tree[i].rmax=tree[i].tmax=r-l+1; //初始化为区间大小
tree[i].free=0;
if(l<r){
int mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
}
}
int query(int i,int len){
if(tree[i].tmax<len) return 0; //情况1
if(tree[i].lmax>=len) return tree[i].l; //情况2
if(tree[i<<1].tmax>=len) return query(i<<1,len); //情况3
else if(tree[i<<1].rmax+tree[i<<1|1].lmax >= len) //情况4
return tree[i<<1].r-tree[i<<1].rmax+1;
else return query(i<<1|1,len); //情况5
}
int update(int l,int r,int i,int state){
if(tree[i].l==l&&tree[i].r==r){ //找到此段区间
tree[i].free=state;
if(state){ //若为1则占用房间 ,否则腾出房间
tree[i].lmax=tree[i].rmax=tree[i].tmax=0;
}else{
tree[i].lmax=tree[i].rmax=tree[i].tmax=tree[i].r-tree[i].l+1;
}
}else if(tree[i].r > tree[i].l){
if(tree[i].free==1){ //树节点的相应信息向下压,即节点信息细致化
tree[i<<1].free=tree[i<<1|1].free=1;
tree[i<<1].lmax=tree[i<<1].rmax=tree[i<<1].tmax=0;
tree[i<<1|1].lmax=tree[i<<1|1].rmax=tree[i<<1|1].tmax=0;
}
if(tree[i].free==0){
tree[i<<1].free=tree[i<<1|1].free=0;
tree[i<<1].lmax=tree[i<<1].rmax=tree[i<<1].tmax=tree[i<<1].r-tree[i<<1].l+1;
tree[i<<1|1].lmax=tree[i<<1|1].rmax=tree[i<<1|1].tmax=tree[i<<1|1].r-tree[i<<1|1].l+1;
}
int mid=(tree[i].r+tree[i].l)>>1;
if(mid>=r) update(l,r,i<<1,state);
else if(mid<l) update(l,r,i<<1|1,state);
else{
update(l,mid,i<<1,state);
update(mid+1,r,i<<1|1,state);
}
tree[i].lmax=tree[i<<1].lmax; //树节点相应信息向上推送,即更新父节点信息
tree[i].rmax=tree[i<<1|1].rmax;
if(tree[i<<1].free==0) tree[i].lmax+=tree[i<<1|1].lmax;
if(tree[i<<1|1].free==0) tree[i].rmax+=tree[i<<1].rmax;
tree[i].tmax=max(tree[i<<1].tmax,tree[i<<1|1].tmax); //选取左孩子tmax和右孩子tmax及左右之间结合的最大值
tree[i].tmax=max(tree[i].tmax,tree[i<<1].rmax+tree[i<<1|1].lmax);
if(tree[i<<1].free==tree[i<<1|1].free) //更新父节点的使用情况
tree[i].free=tree[i<<1].free;
else tree[i].free=-1;
}
}
int main()
{
int N,M,s,num,start,flag;
while(~scanf("%d%d",&N,&M)){
build(1,N,1);
while(M--){
scanf("%d",&flag);
if(flag==1){
scanf("%d",&s);
start=query(1,s); //start为0说明未找到符合房间
printf("%d\n",start);
if(start) update(start,start+s-1,1,1); //假如 start不为零,那么就需要占用
}else{
scanf("%d%d",&s,&num);
update(s,s+num-1,1,0);
}
}
}
return 0;
}
http://acm.nyist.net/JudgeOnline/problem.php?pid=251
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+7;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
struct node{
int n;
char s[100];
};node g[N];
int main()
{
int i,j,k,m,n,ans;
while(~scanf("%d%d",&m,&n))
{
char s[100];
int a;
memset(g,0,sizeof(g));
for(i=0;i<n;i++)
{
cin>>s>>a;
g[a].n++;
strcpy(g[a].s,s);
}
ans=0;
for(i=0;i<=m;i++) if(g[i].n==1) ans++;
if(ans==0)
{
for(i=0;i<=m;i++) if(g[i].n>1) break;
cout<<"The winner is "<<g[i].s<<endl;
cout<<"The price is "<<i<<endl;
}
else
{
for(i=0;i<=m;i++) if(g[i].n==1) break;
cout<<"The winner is "<<g[i].s<<endl;
cout<<"The price is "<<i<<endl;
}
}
return 0;
}