双周赛3
1.打字
题目链接:题目详情 - 7-1 打字 (pintia.cn)
纯模拟枚举签到题
1 #include <bits/stdc++.h>
2 using namespace std;
3 int l_y,l_b,l_g,l_r;
4 int r_r,r_g,r_b,r_y;
5 int main()
6 {
7 string s;
8 cin>>s;
9 for(int i=0;i<s.size();i++)
10 {
11 if(s[i]=='1'||s[i]=='Q'||s[i]=='A'||s[i]=='Z')l_y++;
12 else if(s[i]=='2'||s[i]=='W'||s[i]=='S'||s[i]=='X')l_b++;
13 else if(s[i]=='3'||s[i]=='E'||s[i]=='D'||s[i]=='C')l_g++;
14 else if(s[i]=='4'||s[i]=='R'||s[i]=='F'||s[i]=='V')l_r++;
15 else if(s[i]=='5'||s[i]=='T'||s[i]=='G'||s[i]=='B')l_r++;
16 else if(s[i]=='6'||s[i]=='Y'||s[i]=='H'||s[i]=='N')r_r++;
17 else if(s[i]=='7'||s[i]=='U'||s[i]=='J'||s[i]=='M')r_r++;
18 else if(s[i]=='8'||s[i]=='I'||s[i]=='K'||s[i]==',')r_g++;
19 else if(s[i]=='9'||s[i]=='O'||s[i]=='L'||s[i]=='.')r_b++;
20 else if(s[i]=='0'||s[i]=='P'||s[i]==';'||s[i]=='/'||s[i]=='-'||s[i]=='['||s[i]==']'||s[i]=='\''||s[i]=='=')r_y++;
21 }
22 cout<<l_y<<endl<<l_b<<endl<<l_g<<endl<<l_r<<endl
23 <<r_r<<endl<<r_g<<endl<<r_b<<endl<<r_y<<endl;
24 }
2.分香肠
题目链接:题目详情 - 7-2 分香肠 (pintia.cn)
题目的意思就将N根香肠平均的分成M份,并且要求切割的次数最少,求最少的次数.
1) 当N%M==0时,直接输出为0;
2)当N > M时,没人将得到一根完整的香肠,在将剩下的N%M根香肠平均分成M份,所以,令N = N % M后,直接跳到第三步;
3)当N < M时, 如果M%N==0, 则将每跟香肠切(M/N-1)刀; 否则,切(M/N)刀;
4)将切割之后,每跟香肠剩下的一小部分再进行平均分配。这时,是将N小段香肠平均分成(M%N)份。(即M=M%N)
5) 回到第一步进行循环,结束条件:当N是M的倍数时,结束循环,或者当M为0时,结束循环。
1 #include <bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5 int n,m;
6 cin>>n>>m;
7 int ans=0;
8 while(n%m!=0)
9 {
10 if(n>m)n=n%m;
11 int s=m%n==0?m/n-1:m/n;
12 m=m%n;
13 ans=ans+s*n;
14 if(m==0)break;
15 }
16 cout<<ans;
17 }
3.会议安排
题目链接:题目详情 - 7-3 h0145. 会议安排 (pintia.cn)
按照区间右端点排序(左端点不行),类似于区间选点,挑出覆盖区间最多的点数,贪心证明真抽象
1 #include <bits/stdc++.h>
2 using namespace std;
3 struct Range{
4 int l,r;
5 }range[10005];
6 bool cmp(Range a,Range b)
7 {
8 return a.r<b.r;
9 }
10 int main()
11 {
12 int m;
13 cin>>m;
14 for(int i=0;i<m;i++)
15 {
16 int n;
17 cin>>n;
18 for(int i=0;i<n;i++)
19 {
20 cin>>range[i].l>>range[i].r;
21 }
22 sort(range,range+n,cmp);
23 int res=0;
24 int t=-2e9;
25 for(int i=0;i<n;i++)
26 {
27 if(range[i].l>=t)
28 {
29 res++;
30 t=range[i].r;
31 }
32 }
33 cout<<res<<endl;
34 }
35 }
4.神秘密码
递归,也可以用栈,这样单独每次读入一个字符去递归处理简单易懂
1 #include <bits/stdc++.h>
2 using namespace std;
3 string read()
4 {
5 string s="",s1;
6 char c;
7 while(cin>>c)
8 {
9 if(c==']')return s;
10 else if(c=='[')
11 {
12 int n;
13 cin>>n;
14 s1=read();
15 while(n--)s+=s1;
16 }
17 else s+=c;
18 }
19 }
20
21 int main()
22 {
23 cout<<read();
24 return 0;
25 }
5.国王游戏
题目链接:P1080 [NOIP2012 提高组] 国王游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目思路:直接将所有大臣按左右手上的数的乘积从小到大排序,得到的序列就是最优排队方案。
题目推理:每个人左手影响的是他后面的所有人,而右手仅仅影响自己;
既然想尽可能减少花费,那么左手大的人就必须往后放,否则会导致他后面人的钱都变大;
同时,右手仅仅影响自己,既然想降低开销,那么就应该把右手大的人也往后放,因为越靠后前面大臣的左手累计的乘积越大,那么这只很大的右手在除的时候,发挥的作用也越大(相比放 在前面,轻易的就把这个很大的除数浪费掉了);
因此,左右手这两个属性是同向的,都是越大越应该往后放,至于为什么是乘法而不是加法,因为本题就是乘除法计算
格外注意:本题考查高精×低精度,高精÷低精度,因为每个人手中的值<10000,最多1000人
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N=1010;
4 typedef pair<int,int>PII;
5 int n;
6 PII p[N];
7 vector<int> mul(vector<int>&a,int b)
8 {
9 vector<int>c;
10 int t=0;
11 for(int i=0;i<a.size();i++)
12 {
13 t+=a[i]*b;
14 c.push_back(t%10);
15 t/=10;
16 }
17 while(t)c.push_back(t%10),t/=10;
18 while(c.size()>1 && c.back()==0)c.pop_back();
19 return c;
20 }
21 vector<int> div(vector<int>&a,int b)
22 {
23 vector<int>c;
24 int r=0;
25 for(int i=a.size()-1;i>=0;i--)
26 {
27 r=r*10+a[i];
28 c.push_back(r/b);
29 r%=b;
30 }
31 reverse(c.begin(),c.end());
32 while(c.size()>1&&c.back()==0)c.pop_back();
33 return c;
34 }
35 vector<int> max_vec(vector<int>a,vector<int>b)
36 {
37 if(a.size()>b.size())return a;
38 if(a.size()<b.size())return b;
39 if(vector<int>(a.rbegin(),a.rend()) > vector<int>(b.rbegin(),b.rend()))return a;
40 return b;
41
42 }
43 int main()
44 {
45 cin>>n;
46 for(int i=0;i<=n;i++)
47 {
48 int a,b;
49 cin>>a>>b;
50 p[i]={a*b,a};
51 }
52 sort(p+1,p+1+n);
53 vector<int>product(1,1);
54 vector<int>res(1,0);
55 for(int i=0;i<=n;i++)
56 {
57 if(i)res=max_vec(res,div(product,p[i].first/p[i].second));
58 product=mul(product,p[i].second);
59 }
60 for(int i=res.size()-1;i>=0;i--)cout<<res[i];
61 cout<<endl;
62 return 0;
63 }

浙公网安备 33010602011771号