Samara SAU ACM ICPC 2013-2014 Quarterfinal Qualification Contest
A:
简单题,因为题目中说了不会有数据相同;
1 #include<cstdio> 2 #include<algorithm> 3 #define maxn 200005 4 using namespace std; 5 6 struct node 7 { 8 int a[3]; 9 int id; 10 bool operator <(const node &t)const 11 { 12 return a[2]<t.a[2]; 13 } 14 }no[maxn]; 15 16 int bb[maxn],cnt,n; 17 18 int main() 19 { 20 scanf("%d",&n); 21 int m2=0,m3=0; 22 for(int i=0;i<n;i++) 23 { 24 no[i].id=i; 25 scanf("%d%d%d",&no[i].a[0],&no[i].a[1],&no[i].a[2]); 26 sort(no[i].a,no[i].a+3); 27 if(m2<no[i].a[1])m2=no[i].a[1]; 28 if(m3<no[i].a[0])m3=no[i].a[0]; 29 } 30 sort(no,no+n); 31 for(int i=0;i<n;i++) 32 { 33 if(no[i].a[2]>=m2&&no[i].a[1]>=m3) 34 bb[cnt++]=no[i].id; 35 } 36 printf("%d\n",cnt); 37 sort(bb,bb+cnt); 38 for(int i=0;i<cnt;i++)printf("%d ",bb[i]+1); 39 return 0; 40 }
B:
刚刚开始用了hash,错了,后来发现可以不用hash,把类似的字符串可以变成相同的字符串;
然后一个map就可以解决!
代码:
1 #include<cstdio> 2 #include<map> 3 #include<cstring> 4 #include<string> 5 using namespace std; 6 int cnt,vis[30]; 7 void hash(char *s) 8 { 9 cnt=1; 10 memset(vis,0,sizeof vis); 11 int l=strlen(s); 12 for(int i=0;i<l;i++) 13 { 14 if(vis[s[i]-'a']==0)vis[s[i]-'a']=cnt++; 15 s[i]=vis[s[i]-'a']+'a'-1; 16 } 17 } 18 19 map<string,int>mp; 20 char s[1000009]; 21 int main() 22 { 23 int n; 24 long long ans=0; 25 scanf("%d",&n); 26 for(int i=0;i<n;i++) 27 { 28 scanf("%s",s); 29 hash(s); 30 mp[s]++; 31 } 32 map<string,int>::iterator it; 33 for(it=mp.begin();it!=mp.end();it++) 34 { 35 long long k=it->second; 36 ans+=k*(k-1)/2; 37 } 38 printf("%I64d",ans); 39 return 0; 40 }
C:
直接累加,看前面有多少的累加和与当前的相差为s;
用map好方便的!
代码:
1 #include<cstdio> 2 #include<map> 3 #define ll long long 4 using namespace std; 5 6 map<ll,int>mp; 7 8 int main() 9 { 10 int n; 11 ll x,s,sum=0,ans=0; 12 scanf("%d%I64d",&n,&s); 13 mp[sum]=1; 14 for(int i=1; i<=n; i++) 15 { 16 scanf("%I64d",&x); 17 sum+=x; 18 if(mp.find(sum-s)!=mp.end())ans+=mp[sum-s]; 19 mp[sum]=mp[sum]+1; 20 } 21 printf("%I64d",ans); 22 }
D:
超级easy的题
代码:
1 #include<cstdio> 2 #define maxn 200006 3 using namespace std; 4 5 char a[maxn],b[maxn],c[maxn]; 6 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 scanf("%s%s%s",a,b,c); 12 for(int i=0;i<n;i++) 13 { 14 if(a[i]==b[i])putchar(a[i]); 15 else if(b[i]==c[i])putchar(b[i]); 16 else putchar(c[i]); 17 } 18 return 0; 19 }
F:
一个比较简单的二分!
代码:
1 #include<iostream> 2 #include<algorithm> 3 #define maxn 200005 4 #define ll long long 5 using namespace std; 6 ll a[maxn]; 7 8 int main() 9 { 10 int n; 11 ll l=1,r=0,p,q; 12 cin>>n>>p>>q; 13 for(int i=0; i<n; i++) 14 { 15 cin>>a[i]; 16 r=max(r,a[i]); 17 } 18 if(p==q) 19 { 20 ll cnt=r/p; 21 if(r%p)cnt++; 22 cout<<cnt<<endl; 23 return 0; 24 } 25 while(l<=r) 26 { 27 ll mid=(l+r)/2; 28 ll cnt=0; 29 for(int i=0; i<n; i++) 30 { 31 if(a[i]-mid*q<=0) 32 continue; 33 cnt+=(a[i]-mid*q)/(p-q); 34 if((a[i]-mid*q)%(p-q)!=0) 35 cnt++; 36 } 37 if(cnt>mid)l=mid+1; 38 else r=mid-1; 39 } 40 cout<<r+1ll<<endl; 41 return 0; 42 }
I:
优先队列的应用,没想到啊!
代码:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 5 priority_queue<int>q; 6 int main() 7 { 8 int n,t,d,ans=0,cnt=0; 9 cin>>n; 10 while(n--) 11 { 12 cin>>t>>d; 13 cnt+=d; 14 q.push(d); 15 if(cnt>t) 16 { 17 cnt-=q.top(); 18 ans++; 19 q.pop(); 20 } 21 } 22 cout<<ans; 23 }
J:
简单题:
代码:
1 #include<map> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 pair<int,int>a,b=make_pair(-1,-1); 6 7 int main() 8 { 9 int n,ans=0; 10 cin>>n; 11 for(int i=0;i<n;i++) 12 { 13 cin>>a.first>>a.second; 14 if(a.first>b.first)b=a; 15 ans=max(ans,b.second); 16 } 17 cout<<ans; 18 return 0; 19 }
L:
利用dp的思想,先从最小的开始,大的反正是最小的的组合;
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<map> 4 #include<vector> 5 using namespace std; 6 7 vector<int>ve; 8 map<int,int>m; 9 10 int n; 11 int main() 12 { 13 cin>>n; 14 for(int i=2; i*i<=n; i++)if(n%i==0) 15 { 16 ve.push_back(i); 17 if(i*i!=n)ve.push_back(n/i); 18 } 19 sort(ve.begin(),ve.end()); 20 for(int i=0; i<ve.size(); i++) 21 { 22 m[ve[i]]=ve[i]/2+1; 23 for(int j=0; j<i; j++) 24 if(ve[i]%ve[j]==0) 25 m[ve[i]]=min(m[ve[i]],(m[ve[i]/ve[j]])*(m[ve[j]])); 26 } 27 int mi=n/2+1; 28 for(int i=0;i<ve.size();i++) 29 if(mi>m[ve[i]]*m[n/ve[i]])mi=m[ve[i]]*m[n/ve[i]]; 30 cout<<mi; 31 }