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 }
标签:题目,int,香肠,双周,range,vector,return From: https://www.cnblogs.com/Zac-saodiseng/p/16978563.html