A题,水题,准1Y,第一次CE了。。CF里,CE没有罚时。。
B题,直接模拟。。
#include <cstdio> #include <string> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #include <queue> #include <vector> #include <algorithm> #include <iostream> using namespace std; int minz[31],maxz[31],ans[31]; int main() { int d,sum,i,temp; scanf("%d%d",&d,&sum); temp = 0; for(i = 0; i < d; i ++) { scanf("%d%d",&minz[i],&maxz[i]); ans[i] = minz[i]; temp += minz[i]; } if(temp > sum) printf("NO "); else { for(i = 0; i < d; i ++) { if(temp == sum) break; if(sum - temp > maxz[i]-minz[i]) { ans[i] = maxz[i]; temp += maxz[i] - minz[i]; } else { ans[i] += sum - temp; temp = sum; } } if(temp < sum) printf("NO "); else { printf("YES "); for(i = 0; i < d; i ++) printf("%d ",ans[i]); } } return 0; }
C题,1Y.不能再水。。
D题,无聊排序DP。2Y,我不能忍。。
#include <cstdio> #include <string> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #include <queue> #include <vector> #include <map> #include <algorithm> #include <iostream> using namespace std; struct node { int w,h,id; }p[5100]; int flag[5100]; int n; int cmp(node a,node b) { if(a.w == b.w) return a.h > b.h; else return a.w > b.w; } int dp[5100]; void dfs(int x) { int i; if(dp[x] == 1) return ; for(i = 0;i < x;i ++) { if(p[i].w > p[x].w&&p[i].h > p[x].h&&dp[i]+1 == dp[x]) { printf("%d ",p[i].id); dfs(i); break; } } } int main() { int i,maxz,j; scanf("%d",&n); for(i = 0;i <= n;i ++) { scanf("%d%d",&p[i].w,&p[i].h); p[i].id = i; } sort(p,p+n+1,cmp); for(i = 0;i <= n;i ++) { maxz = 0; for(j = 0;j < i;j ++) { if(p[j].w > p[i].w&&p[j].h > p[i].h) maxz = max(maxz,dp[j]); } dp[i] = maxz + 1; } for(i = 0;i <= n;i ++) { if(p[i].id == 0) { printf("%d ",dp[i]-1); dfs(i); break; } } return 0; }