http://codeforces.com/gym/100735
D题 直接暴力枚举 感觉这道题数据有点问题 为什么要先排下序才能过?不懂。。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 55; const int maxm = 1e4+10; const int inf = 0x3f3f3f3f; const double epx = 1e-10; typedef long long ll; int n,m; ll a[maxn]; int main() { while(cin>>n) { for(int i=1; i<=n; i++) { scanf("%I64d",&a[i]); } sort(a+1,a+1+n); int ans=0; int visit[maxn]; memset(visit,0,sizeof(visit)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { if(visit[i]==0&&visit[j]==0&&visit[k]==0&&i!=j&&j!=k&&i!=k&&a[i]+a[k]>a[j]&&a[i]+a[j]>a[k]&&a[j]+a[k]>a[i]) { ans++; visit[i]=1,visit[j]=1,visit[k]=1; } } } } printf("%d\n",ans); } }
E题 n*n的数字矩阵 横着 竖着 对角线 相加都等于val 可以推出 公式把矩阵 每行(或者每列)已有的数字加起来除以n-1=val 每行(每列)只有一个未知用val去减就好了。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 1005; const int maxm = 1e4+10; const int inf = 0x3f3f3f3f; const double epx = 1e-10; typedef long long ll; int n,m; ll a[maxn][maxn]; int main() { cin>>n; ll sum[maxn],zong=0; for(int i=0; i<n; i++) { sum[i]=0; for(int j=0; j<n; j++) { scanf("%I64d",&a[i][j]); sum[i]+=a[i][j]; } zong+=sum[i]; } zong=zong/(n-1); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { ll x=a[i][j]; if(i==j) x=zong-sum[i]; if(j==n-1) printf("%I64d\n",x); else printf("%I64d ",x); } } }
G题 水题
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 1e5+10; const int maxm = 1e4+10; const int inf = 0x3f3f3f3f; const double epx = 1e-10; typedef long long ll; int n,m; char a[maxn]; int main() { cin>>a; int sum=0,ans=0; int len=strlen(a); for(int i=0;i<len;i++) { if(a[i]==‘1‘) ans++; } printf("%d\n",min(ans,len-ans)); }
H题 要用二分图最大匹配写 用dfs会T的很惨。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <string> #include <queue> #include <map> #include <vector> using namespace std; const int maxn = 105; const int maxm = 1e4+10; const int inf = 0x3f3f3f3f; const double epx = 1e-10; typedef long long ll; int n; char a[maxn][10]; char s[maxn]; int len; int visit[maxn]; int m[maxn][maxn]; int match[maxn]; bool found(int x) { for(int i=1;i<=n;i++) { if(m[x][i]==1&&visit[i]==0) { visit[i]=1; if(match[i]==-1||found(match[i])) { match[i]=x; return true; } } } return false; } int main() { cin>>s>>n; len=strlen(s); memset(m,0,sizeof(m)); memset(match,-1,sizeof(match)); for(int i=1; i<=n; i++) { for(int j=0; j<6; j++) { cin>>a[i][j]; for(int k=0;k<len;k++) { if(a[i][j]==s[k]) m[k][i]=1; } } } int ans=0; for(int i=0;i<len;i++) { memset(visit,0,sizeof(visit)); if(found(i)) ans++; } if(ans==len) printf("YES\n"); else printf("NO\n"); }
I题 大数加法 Java大数类
import java.util.*; import java.math.*; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); BigInteger a, b,c,a1,b1,c1; while (cin.hasNext()) { a = cin.nextBigInteger(); b = cin.nextBigInteger(); c = cin.nextBigInteger(); a1=a.add(a);b1=b.add(b);c1=c.add(c); int flag=0; if(a.add(b).compareTo(c)==0) flag=1; else if(a.add(c).compareTo(b)==0) flag=1; else if(b.add(c).compareTo(a)==0) flag=1; else if(a1.compareTo(b)==0) flag=1; else if(a1.compareTo(c)==0) flag=1; else if(b1.compareTo(a)==0) flag=1; else if(b1.compareTo(c)==0) flag=1; else if(c1.compareTo(b)==0) flag=1; else if(c1.compareTo(a)==0) flag=1; if(flag==1) System.out.println("YES"); else System.out.println("NO"); } } }
菜菜菜 就出了几道水题