KEYENCE Programming Contest 2019 自閉記
阿新 • • 發佈:2019-01-13
A:簽到。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define ll long long int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() { int x=0,f=1;char c=getchar();View Codewhile (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int a[4]; int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); for (int i=0;i<4;i++) a[i]=read(); sort(a,a+4); if (a[0]==1&&a[1]==4&&a[2]==7&&a[3]==9) cout<<"YES"; else cout<<"NO"; }
B:簽到*2。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> usingView Codenamespace std; #define ll long long int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } char s[110]; int n; int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); scanf("%s",s);n=strlen(s); char a[]="keyence"; if (n<7) cout<<"NO"; else { int x=0,y=0; for (int i=0;i<7;i++) if (s[i]==a[i]) x++;else break; for (int i=n-1;i>n-8;i--) if (s[i]==a[7-(n-i)]) y++;else break; if (x+y>=7) cout<<"YES"; else cout<<"NO"; } }
C:按ai-bi從小到大排序,依次將剩餘最多的分配給需求最大的即可。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N 100010 int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int n,c[N]; ll ans; struct data { int x,y; bool operator <(const data&a) const { return x-y<a.x-a.y; } }a[N]; int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); n=read(); for (int i=1;i<=n;i++) a[i].x=read(); for (int i=1;i<=n;i++) a[i].y=read(); sort(a+1,a+n+1); for (int i=1;i<=n;i++) c[i]=a[i].x; for (int i=1;i<=n;i++) ans+=a[i].x-a[i].y; if (ans<0) {cout<<-1;return 0;} int x=n,ans=0; for (int i=1;i<=n;i++) { if (a[i].x>=a[i].y) break; while (a[i].y-a[i].x>a[x].x-a[x].y) { a[i].x+=a[x].x-a[x].y; a[x].x=a[x].y; x--; } a[x].x-=a[i].y-a[i].x,a[i].x=a[i].y; } for (int i=1;i<=n;i++) if (c[i]!=a[i].x) ans++; cout<<ans; }View Code
D:按數從大到小考慮,如果其作為某行最大值出現就會多一行被佔領,列同理。記錄當前被佔領的行和列的數量,每次考慮填當前數的方案數,根據其是否在行列最大值中出現,分類討論一下,給答案乘上這個方案數即可。這個弱智的不行的討論寫了我一年。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N 1010 #define P 1000000007 int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int n,m,a[N],b[N],posa[N*N],posb[N*N],ans; int row,line; int main() { //freopen("a.in","r",stdin); //freopen("a.out","w",stdout); n=read(),m=read(); for (int i=1;i<=n;i++) { a[i]=read(); if (posa[a[i]]) {cout<<0;return 0;} posa[a[i]]=i; } for (int i=1;i<=m;i++) { b[i]=read(); if (posb[b[i]]) {cout<<0;return 0;} posb[b[i]]=i; } row=0,line=0;ans=1; for (int i=n*m;i>=1;i--) { if (posa[i]&&posb[i]) {row++,line++;continue;} if (!posa[i]&&!posb[i]) { if (row*line-(n*m-i)<=0) {cout<<0;return 0;} ans=1ll*ans*(row*line-(n*m-i))%P; } if (posa[i]) ans=1ll*ans*line%P,row++; if (posb[i]) ans=1ll*ans*row%P,line++; } cout<<ans; }View Code
result:rank 241 rating +19