A题:
题意:判断火星上的节假日最多和最少
分析:除以7,然后我们对原数模7的余数进行判断一下即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 int n; 15 int main() 16 { 17 while(cin>>n) 18 { 19 int minx,mx; 20 int t=n/7; 21 t*=2; 22 if(n%7==0){ 23 minx=mx=t; 24 }else if(n%7==1){ 25 minx=t; 26 mx=t+1; 27 }else if(n%7==6){ 28 minx=t+1; 29 mx=t+2; 30 }else{ 31 minx=t; 32 mx=t+2; 33 } 34 cout<<minx<<" "<<mx<<endl; 35 } 36 return 0; 37 }
B题:
题意:有n个机器人,第i个机器人纪录其前面的i-1个数和其本身,问第k个数是多少
分析:判断一下第k个属于第几个机器人的即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=500002; 15 long long dp[maxn]; 16 int a[maxn]; 17 int n; 18 int k; 19 int main() 20 { 21 while(cin>>n>>k) 22 { 23 for(int i=0;i<n;i++) 24 cin>>a[i]; 25 int h; 26 int ans; 27 memset(dp,0,sizeof(dp)); 28 for(int i=1;i<=n;i++){ 29 dp[i]=dp[i-1]+i; 30 if(dp[i]>=k){ 31 h=i; break; 32 } 33 } 34 int flag=0; 35 if(dp[h]==k){ 36 flag=1; 37 }else{ 38 h--; flag=0; 39 } 40 if(flag) cout<<a[h-1]<<endl; 41 else{ 42 int t=k-dp[h]; 43 //cout<<"t: "<<t<<endl; 44 cout<<a[t-1]<<endl; 45 } 46 } 47 return 0; 48 }
C题:
题意:n个科学家来自不同国家,每个科学家对应懂一种语言,有双语电影,其中声音和文字是不同语言,希望找到一个电影院,让尽可能多的科学家能看懂,如果声音相同的情况比较文字尽量多的
分析:因为数据范围太大,用map进行统计每会说没中语言的科学家的人数,然后进行排序即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=200020; 15 map<int,int> vis; 16 typedef struct p 17 { 18 int id; 19 int aud,sub; 20 }p; 21 p s[maxn]; 22 bool cmp(p a,p b) 23 { 24 if(a.aud==b.aud) 25 return a.sub>b.sub; 26 else 27 return a.aud>b.aud; 28 } 29 int main() 30 { 31 int n,m; 32 cin>>n; 33 for(int i=0;i<n;i++){ 34 int x; 35 scanf("%d",&x); 36 vis[x]++; 37 } 38 cin>>m; 39 for(int i=0;i<m;i++){ 40 int y; 41 scanf("%d",&y); 42 s[i].id=i+1; 43 s[i].aud=vis[y]; 44 } 45 for(int i=0;i<m;i++){ 46 int z; 47 scanf("%d",&z); 48 s[i].sub=vis[z]; 49 } 50 sort(s,s+m,cmp); 51 printf("%d ",s[0].id); 52 return 0; 53 }
D题:
题意:做一个蛋糕需要n种成份,需要每种成分ai,每种成分有bi,同时还有k个能转换成任意成分的物品,问最多能构成多少物品
分析:可以以bi除以ai为序,然后用一个优先队列进行维护,期间模拟k个物品的情况即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=1010; 15 typedef struct p 16 { 17 int a,b; 18 int mul,mod; 19 friend bool operator<(p x,p y){ 20 return x.mul>y.mul; 21 } 22 }p; 23 p s[maxn]; 24 int n,k; 25 int main() 26 { 27 while(cin>>n>>k) 28 { 29 for(int i=0;i<n;i++) 30 cin>>s[i].a; 31 for(int i=0;i<n;i++){ 32 cin>>s[i].b; 33 s[i].mul=s[i].b/s[i].a; 34 s[i].mod=s[i].b%s[i].a; 35 } 36 priority_queue<p> que; 37 for(int i=0;i<n;i++) 38 que.push(s[i]); 39 while(true){ 40 p h=que.top(); 41 int t=h.a-h.mod; 42 k-=t; 43 if(k<0) break; 44 //cout<<"t: "<<t<<endl; 45 h.b+=t; 46 h.mod=h.b%h.a; 47 h.mul=h.b/h.a; 48 //cout<<h.mul<<endl; 49 if(k>=0){ 50 que.pop(); 51 que.push(h); 52 if(k==0) 53 break; 54 } 55 } 56 int z=que.top().mul; 57 cout<<z<<endl; 58 } 59 return 0; 60 }