17
使用最简单的枚举就可以解决该问题。在有些情况下,只买两包零食甚至一包零食可能要比买三包零食的情况更优,所以三种情况都要考虑。
AC代码:
#include<iostream> using namespace std; float price[100]; int wanted[100]; int main() { int Q; scanf("%d",&Q); while(Q--) { int N; int ans=0; scanf("%d",&N); for(int i=0;i<N;i++) { cin>>price[i]>>wanted[i]; } for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { for(int k=0;k<N;k++) { if(i!=j&&j!=k&&i!=k) { int m=price[i]+price[j]+price[k]; if((!(m%5))&&(!(price[i]+price[j]+price[k]-m))) { if(wanted[i]+wanted[j]+wanted[k]>ans) ans=wanted[i]+wanted[j]+wanted[k]; } } } } } for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { if(i!=j) { int m=price[i]+price[j]; if((!(m%5))&&(!(price[i]+price[j]-m))) { if(wanted[i]+wanted[j]>ans) ans=wanted[i]+wanted[j]; } } } } for(int i=0;i<N;i++) { int m=price[i]; if((!(m%5))&&(!(price[i]-m))) { if(wanted[i]>ans) ans=wanted[i]; } } printf("%d\n",ans); } }题目2 : 清理海报
AC代码:
#include<iostream> #include<cstring> #include<queue> using namespace std; int x1[1010],x2[1010],y1[1010],y2[1010]; int map[1010][1010]; int flag[1010],vis[1010]; int W,H,N,num; bool checkin1(int i,int j) { if((x1[j]<x2[i])&&(x2[i]<x2[j])&&(y1[j]<y2[i])&&(y2[i]<y2[j])) return 1; return 0; } bool checkin2(int i,int j) { if((x1[j]<x2[i])&&(x2[i]<x2[j])&&(y1[j]<y1[i])&&(y1[i]<y2[j])) return 1; return 0; } bool checkin3(int i,int j) { if((x1[j]<x1[i])&&(x1[i]<x2[j])&&(y1[j]<y1[i])&&(y1[i]<y2[j])) return 1; return 0; } bool checkin4(int i,int j) { if((x1[j]<x1[i])&&(x1[i]<x2[j])&&(y1[j]<y2[i])&&(y2[i]<y2[j])) return 1; return 0; } bool checkin5(int i,int j) { if((x1[i]>=x1[j])&&(x1[i]<=x2[j])&&(x2[i]>=x1[j])&&(x2[i]<=x2[j]) &&(y1[j]>=y1[i])&&(y1[j]<=y2[i])&&(y2[j]>=y1[i])&&(y2[j]<=y2[i])) { return 1; } return 0; } int find(int i) { num=1; queue<int> q; q.push(i); vis[i]=1; while(!q.empty()) { int k=q.front(); q.pop(); for(int j=1;j<=N;j++) { if((map[k][j])&&(!vis[j])&&(k!=j)) { vis[j]=1; num++; q.push(j); } } } return num; } int main() { scanf("%d %d %d",&W,&H,&N); memset(map,0,sizeof(map)); memset(flag,0,sizeof(flag)); for(int i=1;i<=N;i++) { cin>>x1[i]>>y1[i]>>x2[i]>>y2[i]; } for(int i=1;i<=N;i++) { for(int j=1;j<=N;j++) { if(j>i) { if(checkin1(j,i)||checkin2(j,i)||checkin3(j,i) ||checkin4(j,i)||checkin1(i,j)||checkin2(i,j) ||checkin3(i,j)||checkin4(i,j)||checkin5(i,j)||checkin5(j,i)) { map[i][j]=1; } } } } int flag1,flag2,flag3,flag4; for(int i=1;i<=N;i++) { flag1=0,flag2=0,flag3=0,flag4=0; for(int j=1;j<=N;j++) { if(j>i) { if(checkin1(i,j)) flag1=1; if(checkin2(i,j)) flag2=1; if(checkin3(i,j)) flag3=1; if(checkin4(i,j)) flag4=1; } } if(flag1&&flag2&&flag3&&flag4) { flag[i]=1; } } int answer1=0,answer2=0; for(int i=1;i<=N;i++) { if(!flag[i]) { memset(vis,0,sizeof(vis)); int temp=find(i); if(answer1<temp) { answer1=temp; answer2=i; } } } printf("%d %d\n",answer1,answer2); }还有两道题本人当时没有做出来,以后再更新吧。