感觉这次的题目还是挺简单的。
A : 如果两个人认识,那么就彼此各喝一杯酒,认识用1表示。另外主人肯定认识每一个人。数矩阵中的1加上人数n*2(主人的缘故)。
#include<iostream> #include<string> using namespace std; int s[40][40]; int main() { int n; while(cin>>n) { int ans=0; ans+=n*2; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>s[i][j]; ans+=s[i][j]; } cout<<ans<<endl; } }
然后将每个相同高度的下标放入queue储存。(不用vector是因为删除的时候erase要移动后面的全部元素,效率极低)。对于每次询问,
当前高度有下标就输出,然后pop,没有就输出-1.
#include<iostream> #include<string> #include<cstdio> #include<vector> #include<queue> #include<map> using namespace std; queue <int> v[100001]; map<int,int> mp; int main() { int n,m,h; while(scanf("%d%d",&n,&m)!=EOF) { int cnt=1; for(int i=1;i<=n;i++) { while(!v[i].empty()) v[i].pop(); } mp.clear(); for(int i=1;i<=n;i++) { scanf("%d",&h); if(!mp[h]) mp[h]=cnt++; v[mp[h]].push(i); } for(int i=1;i<=m;i++) { scanf("%d",&h); h=mp[h]; if(v[h].empty()) printf("%d\n",-1); else { int op=v[h].front(); printf("%d\n",op); v[h].pop(); } } } return 0; }
(3)由左边走过来并且取了当前位置。(4)由右边走过来并且取了当前位置。由此可得状态转移方程。剩下的按照背包来就行。
#include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; int dp[101][101][101]; int w[101][101]; int main() { int n,m,k; while(cin>>n>>m>>k) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>w[i][j]; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int p=w[i][j];p<=k;p++)//要能装入当前的蛋糕 { //取四种状态的最大值 dp[i][j][p]=max(dp[i-1][j][p],dp[i][j-1][p]); dp[i][j][p]=max(dp[i][j][p],max(dp[i-1][j][p-w[i][j]],dp[i][j-1][p-w[i][j]])+w[i][j]); } cout<<dp[n][m][k]<<endl; } return 0; }
BestCoder #42题解(hdu 5232 & 5233 & 5234)
原文地址:http://blog.csdn.net/nk_test/article/details/45953945