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
",cnt);
37     sort(bb,bb+cnt);
38     for(int i=0;i<cnt;i++)printf("%d ",bb[i]+1);
39     return 0;
40 }
View Code

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 }
View Code

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 }
View Code

 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 }
View Code

 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 }
View Code

 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 }
View Code

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 }
View Code

 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 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3381404.html