题意:判断一个角是不是正多边形的内角。
分析:如果 60<=d<180 && 360%(180-n)==0 就是符合的内角。
#include <stdio.h> #include <math.h> #include <string.h> int main() { int t; int n; scanf("%d",&t); while (t--) { scanf("%d",&n); if (n<180 && n>=60 && 360%(180-n)==0) printf("YES\n"); else printf("NO\n"); } return 0; }
题意:模拟题。n个线程,知道了每个线程现在的位置,问那些线程里面一定有新的消息。
分析:从末尾开始找到尽可能长的连续递增序列,再用总数减去。
#include <stdio.h> #include <string.h> int a[100005]; int main() { int n, i, tot; while (scanf("%d",&n)!=EOF) { tot = 0; for (i=0; i<n; i++) scanf("%d",&a[i]); for (i=n-1; i>=0;--i) if (i==n-1 || (i!=n-1&&a[i]<a[i+1])) tot++; else break; printf("%d\n",n-tot); } return 0; }
题意:有n个盒子,每个盒子的长度为2^k,一个盒子只有边长比另一个小才能放入,问最少需要多大的盒子能将这些盒子全装起来。
分析:将每个盒子分开考虑,求出能装下每种盒子的最大盒子。
#include <cstdio> #define max(a,b) (a)>(b)?(a):(b) int main() { int p, n, i; int k, a; while (scanf("%d",&n)!=EOF) { p = 0; while (n--) { scanf("%d %d",&k,&a); if (a == 1){ k++; p = max(p,k); } else{ while (a && a!=1) { if (a%4 == 0) a /= 4; else a = a/4+1; k++; } p = max(p,k); } } printf("%d\n",p); } return 0; }
题意:有m种花朵,知道了每种花的位置和编号,现在要把无序的花朵调整成有序的,同种花朵放在一起,问最少移动多少盆花。
分析:最长单调子序列变形,求出最长非递减子序列,然后用总数减去即可。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[5005]; int main() { int i, j; int n, m, len, p; while (scanf("%d %d",&n,&m)!=EOF) { len = 0; for (i=0; i<n; i++){ scanf("%d%*s",&p); j = upper_bound(a,a+len,p)-a; a[j] = p; if (j==len) len++; } printf("%d\n",n-len); } return 0; }
#include <stdio.h> #include <string.h> int b[5005]; int p[5005]; int bSearch(int num, int k) { int low=1, high=k; while(low<=high) { int mid=(low+high)/2; if(num>=b[mid]) low=mid+1; else high=mid-1; } return low; } int n; int LIS(){ int k = 1; b[1] = p[1]; for(int i=2; i<=n; ++i){ if(p[i]>=b[k]) b[++k] = p[i]; else{ int pos = bSearch(p[i], k); b[pos] = p[i]; } } return k; } int main() { int i, m; while (scanf("%d %d",&n,&m)!=EOF) { for (i=1; i<=n; i++) scanf("%d %*s",&p[i]); printf("%d\n",n-LIS()); } return 0; }