ホームページ >ウェブフロントエンド >htmlチュートリアル >Codeforces ラウンド #274 (ディビジョン 2) ソリューション Report_html/css_WEB-ITnose
質問アドレス: http://codeforces.com/contest/479
今回は4つの質問しか答えられません。
質問A: 表現
水の質問。
6 つの状況を列挙し、最大値を見つけるだけです。
コードは次のとおりです:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64int main(){ LL a, b, c, d[10]; while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF) { d[0]=a*b*c; d[1]=(a+b)*c; d[2]=a+b+c; d[3]=a*(b+c); d[4]=a+b*c; d[5]=a*b+c; sort(d,d+6); printf("%I64d\n",d[5]); } return 0;}
水の質問。
毎回、最大のものと最小のものの差が 1 以下になるまで、最大のものを取り出し、最小のものに与えます。
コードは次のとおりです:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64struct node{ int x, num;}fei[1000];int cmp(node x, node y){ return x.x<y.x;}int a[2000], b[2000];int main(){ int n, m, i, j, cnt, ans; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&fei[i].x); fei[i].num=i; } cnt=0; while(m--) { sort(fei,fei+n,cmp); if(fei[n-1].x-fei[0].x<=1) break; a[cnt]=fei[n-1].num; b[cnt++]=fei[0].num; fei[n-1].x--; fei[0].x++; } sort(fei,fei+n,cmp); printf("%d %d\n",fei[n-1].x-fei[0].x, cnt); for(i=0;i<cnt;i++) { printf("%d %d\n",a[i]+1,b[i]+1); } } return 0;}
まだ水です。 。小さな欲
小さな欲。まず、マークされた日付で並べ替えて、小さいものを使用できる場合は、小さいものを優先してスキャンします。
コードは次のとおりです:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64struct node{ int x, y;}fei[6000];int cmp(node x, node y){ if(x.x==y.x) return x.y<y.y; return x.x<y.x;}int main(){ int n, i, j, ans, k, x1, x2; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d%d",&fei[i].x,&fei[i].y); } sort(fei,fei+n,cmp); k=1; for(i=0;i<n;i++) { if(fei[i].y>=k) { k=fei[i].y; } else { k=fei[i].x; } } printf("%d\n",k); } return 0;}
静止水。 。 。 。 2点。
x、y、x+y、y-x の 4 つの状況をそれぞれ考えてみましょう。次に、2 つの点を使用して、これら 4 つの数値の差を見つけます。
コードは次のとおりです:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define LL __int64int a[110000];int bin_search(int x, int y, int high){ int low=0, mid; while(low<=high) { mid=low+high>>1; if(y-a[mid]==x) return 1; else if(y-a[mid]>x) low=mid+1; else high=mid-1; } return 0;}int main(){ int n, l, x, y, i, j, k, flag1, flag2; while(scanf("%d%d%d%d",&n,&l,&x,&y)!=EOF) { flag1=flag2=0; for(i=0; i<n; i++) { scanf("%d",&a[i]); if(a[i]==x) flag1=1; if(a[i]==y) flag2=1; } if(flag1&&flag2) { printf("0\n"); } else { flag1=flag2=0; for(i=1;i<n;i++) { if(bin_search(x,a[i],i-1)) { flag1=1; break; } } for(i=1;i<n;i++) { if(bin_search(y,a[i],i-1)) { flag2=1; } } if(flag1&&flag2) { printf("0\n"); } else if(flag1) printf("1\n%d\n",y); else if(flag2) printf("1\n%d\n",x); else { int flag=0; for(i=1;i<n;i++) { if(bin_search(y+x,a[i],i-1)) { flag=1; break; } } if(flag) { printf("1\n%d\n",a[i]-x); } else { flag=0; for(i=1;i<n;i++) { if(bin_search(y-x,a[i],i-1)&&(a[i]-y>=0||a[i]+x<=l)) { flag=1; break; } } if(flag&&a[i]-y>=0) { printf("1\n%d\n",a[i]-y); } else if(flag&&a[i]+x<=l) { printf("1\n%d\n",a[i]+x); } else { printf("2\n%d %d\n",x,y); } } } } } return 0;}