题目来自ICPC 2017 Japan Domestic
A题:Taro's Shopping
直接按照题意写
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 bool cmp(int x,int y) 5 { 6 return x>y; 7 } 8 int n,m,a[1005]; 9 int main() 10 { 11 while(1) 12 { 13 scanf("%d%d",&n,&m); 14 if(n==0&&m==0) return 0; 15 for(int i=0;i<n;i++) scanf("%d",&a[i]); 16 sort(a,a+n,cmp); 17 int ans=-1; 18 for(int i=0;i<n;i++) 19 for(int j=i+1;j<n;j++) 20 if(a[i]+a[j]<=m) 21 ans=max(ans,a[i]+a[j]); 22 if(ans==-1) printf("NONE "); 23 else printf("%d ",ans); 24 } 25 return 0; 26 }
B题:Almost Identical Programs
输入的两个字符串相同输出“IDENTICAL”,如果只有一个双引号里面的字符串不同,输出“CLOSE”,其他的输出“DIFFERENT”
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 string s1,s2; 5 int main() 6 { 7 while(cin>>s1) 8 { 9 if(s1==".") return 0; 10 cin>>s2; 11 if(s1==s2) {cout<<"IDENTICAL"<<endl;continue;} 12 string a1[200]={""},b1[200]={""},a2[200]={""},b2[200]={""}; 13 string tmp1="",tmp2=""; 14 int cnt1=0,cnt2=0,cnt3=0,cnt4=0; 15 for(int i=0;i<s1.size();i++) 16 { 17 if(s1[i]!='"') {tmp1+=s1[i];continue;} 18 if(tmp1!="") a1[cnt1++]=tmp1; 19 tmp1=""; 20 i++; 21 while(s1[i]!='"') 22 { 23 tmp2+=s1[i]; 24 i++; 25 } 26 b1[cnt2++]=tmp2; 27 tmp2=""; 28 } 29 if(tmp1!="") a1[cnt1++]=tmp1; 30 tmp1=""; 31 for(int i=0;i<s2.size();i++) 32 { 33 if(s2[i]!='"'){tmp1+=s2[i];continue;} 34 if(tmp1!="") a2[cnt3++]=tmp1; 35 tmp1=""; 36 i++; 37 while(s2[i]!='"') 38 { 39 tmp2+=s2[i]; 40 i++; 41 } 42 b2[cnt4++]=tmp2; 43 tmp2=""; 44 } 45 if(tmp1!="") a2[cnt3++]=tmp1; 46 int flag1=0,flag2=0; 47 if(cnt1==cnt3) 48 { 49 for(int i=0;i<cnt1;i++) 50 { 51 if(a1[i]!=a2[i]) 52 { 53 flag1=1; 54 break; 55 } 56 } 57 } 58 else flag1=1; 59 if(cnt2==cnt4) 60 { 61 int cnt=0; 62 for(int i=0;i<cnt2;i++) 63 { 64 if(b1[i]!=b2[i]) cnt++; 65 } 66 if(cnt>=2) flag2=1; 67 } 68 else flag2=1; 69 if(!flag1&&!flag2) cout<<"CLOSE"<<endl; 70 else cout<<"DIFFERENT"<<endl; 71 } 72 return 0; 73 }
C题:A Garden with Ponds
建水池,要求四周的高度最小值必须严格大于水池内部的高度,然后求水池最多能装多少水。
暴力枚举水池
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 int Map[15][15]; 6 int n,m; 7 8 int cal(int nn,int mm,int k,int p) 9 { 10 int Min = 100; 11 for(int i=k;i<k+nn;i++) 12 { 13 Min = min(Map[i][p],Min); 14 Min = min(Map[i][p+mm-1],Min); 15 } 16 for(int i=p;i<p+mm;i++) 17 { 18 Min = min(Map[k][i],Min); 19 Min = min(Map[k+nn-1][i],Min); 20 } 21 int anst = 0; 22 for(int i=k+1;i<k+nn-1;i++) 23 { 24 for(int j=p+1;j<p+mm-1;j++) 25 { 26 if(Map[i][j]>=Min) 27 return 0; 28 anst+=(Min-Map[i][j]); 29 } 30 } 31 return anst; 32 } 33 34 int main() 35 { 36 37 while(scanf("%d%d",&n,&m)) 38 { 39 if(n==0&&m==0) 40 break; 41 for(int i=1;i<=n;i++) 42 for(int j=1;j<=m;j++) 43 scanf("%d",&Map[i][j]);//>>Map[i][j]; 44 45 int ans = 0; 46 47 for(int i=3;i<=n;i++) 48 { 49 for(int j=3;j<=m;j++) 50 { 51 for(int k=1;i+k-1<=n;k++) 52 { 53 for(int p=1;p+j-1<=m;p++) 54 { 55 ans = max(ans,cal(i,j,k,p)); 56 //cout<<cal(i,j,k,p)<<endl; 57 } 58 } 59 } 60 } 61 printf("%d ",ans); 62 } 63 }