Codeforces Round #270
A
题意:给出一个数n,求满足a+b=n,且a+b均为合数的a,b
方法一:可以直接枚举i,n-i,判断a,n-i是否为合数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #define mod=1e9+7; 10 using namespace std; 11 12 typedef long long LL; 13 bool isp[1001000]; 14 15 void isprime(){ 16 isp[1]=isp[0]=true; 17 for(int i=2;i<=1000010;i++){ 18 if(isp[i]==false) 19 for(int j=i*2;j<=1000010;j+=i) 20 isp[j]=true; 21 } 22 } 23 24 int main() 25 { 26 int n; 27 cin>>n; 28 isprime(); 29 for(int i=2;i<=n;i++){ 30 if(isp[i]&&isp[n-i]){ 31 printf("%d %d\n",i,n-i); 32 break; 33 } 34 } 35 return 0; 36 }
方法二:注意到n>=12,而4是最小的合数,
所以:当n为奇数的时候,那么n-9至少是为4的合数,输出9,n-9
当n为偶数的时候,那么n-8至少是为4的合数,输出8,n-8
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #define mod=1e9+7; 10 using namespace std; 11 12 typedef long long LL; 13 14 int main(){ 15 int n; 16 cin>>n; 17 if(n%2) printf("%d %d\n",9,n-9); 18 else printf("%d %d\n",8,n-8); 19 return 0; 20 }
B
题意:给出一个电梯,给出n个人,n个人要上到的楼层a[i],以及电梯每次最多能装载的人数k,问把每个人都送到目标楼层,需要花费的最少时间
看的出题人的题解:先是第一组k个人和这k个人里面要去往的楼层最高的人乘同一次电梯,再是第二组k个人和这k个人里面要去往的楼层最高的人乘同一次电梯,
所以总时间为ans=2*((a[n]-1)+(a[n-k]-1)+a[n-2k]-1)----
所以先排序,再倒着取依次取第k个数,这样能够尽量减少下一次运送人的时间, 出题人的证明没有看明白= =
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #define mod=1e9+7; 10 using namespace std; 11 12 typedef long long LL; 13 int a[100050]; 14 15 int main(){ 16 int n,k,i,j,ans=0; 17 cin>>n>>k; 18 for(i=1;i<=n;i++) cin>>a[i]; 19 sort(a+1,a+n+1); 20 for(i=n;i>=1;i=i-k){ 21 ans+=(a[i]-1)*2; 22 } 23 printf("%d\n",ans); 24 return 0; 25 }
C
题意:给出n个人的姓,和名,任意选择其中一个作为排序的关键字,问能否满足给出的序列。
按照给出的序列来遍历,先将a[i],b[i]排序成小的在前,大的在后,如果a[i]大于当前的cur,那么将a[i]赋值给cur,否则b[i]赋给cur,都不满足的话则是“NO” 就是尽量选择a[i],b[i]中更小的作为关键字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<algorithm> 9 #define mod=1e9+7; 10 using namespace std; 11 12 typedef long long LL; 13 string a[100050],b[100050]; 14 int p[100050]; 15 string cur=""; 16 17 int main() 18 { 19 int n,i,j; 20 cin>>n; 21 for(i=0;i<n;i++) cin>>a[i]>>b[i]; 22 for(i=0;i<n;i++) { 23 cin>>p[i]; 24 p[i]--; 25 } 26 27 for(i=0;i<n;i++){ 28 int x=p[i]; 29 if(a[x]>b[x]) swap(a[x],b[x]); 30 if(cur<a[x]) cur=a[x]; 31 else if(cur<b[x]) cur=b[x]; 32 else{ 33 printf("NO\n"); 34 return 0; 35 } 36 } 37 printf("YES\n"); 38 return 0; 39 }
D
题意:给出一个矩阵,问这个矩阵是否能由一颗带权值的树构成
先用prim建树,再依次枚举每一个节点到其他节点的距离,看是否和给出的矩阵一样
还不懂写= =