题意:统计n个游戏数据,p代表游玩次数,c代表通关次数,每次游玩都不一定通关,求这些数据是否合法
题解:1.游玩次数不能小于通关次数 2.游玩次数和通关次数必须单增 3.每次增加的游玩次数不能小于通关次数
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <stack> 7 #include <queue> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <unordered_set> 12 #include <unordered_map> 13 #define ll long long 14 #define fi first 15 #define se second 16 #define pb push_back 17 #define me memset 18 const int N = 1e6 + 10; 19 const int mod = 1e9 + 7; 20 using namespace std; 21 typedef pair<int,int> PII; 22 typedef pair<long,long> PLL; 23 24 int t; 25 int n; 26 int p,c,mp=0,mc=0,tp=0,tc=0; 27 28 int main() { 29 ios::sync_with_stdio(false); 30 cin>>t; 31 while(t--){ 32 tp=0,tc=0; 33 bool flag=1; 34 cin>>n; 35 for(int i=0;i<n;++i){ 36 cin>>p>>c; 37 if(i==0) tp=p,tc=c; 38 if(p<tp || c<tc || (p==tp && c>tc) || p<c || (p-tp<c-tc)){ 39 flag=0; 40 } 41 tp=p; 42 tc=c; 43 } 44 if(flag==0) printf("NO\n"); 45 else printf("YES\n"); 46 } 47 48 return 0; 49 }
题意:定义每人拥有的钱不小于x时为富人,现在有n个人,可以选(1<=x<=n)个人出来将他们的财产平分给所有人,求最多能有多少富人
题解:对每个人拥有的钱排个序,然后贪心,从最有钱的人开始往前遍历,记录一个最大值即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <stack> 7 #include <queue> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <unordered_set> 12 #include <unordered_map> 13 #define ll long long 14 #define fi first 15 #define se second 16 #define pb push_back 17 #define me memset 18 const int N = 1e6 + 10; 19 const int mod = 1e9 + 7; 20 using namespace std; 21 typedef pair<int,int> PII; 22 typedef pair<long,long> PLL; 23 24 int t; 25 int n; 26 long double x,sum[N]; 27 int ans=0; 28 long double a[N]; 29 int main() { 30 ios::sync_with_stdio(false); 31 cin>>t; 32 while(t--){ 33 cin>>n>>x; 34 ans=0; 35 for(int i=0;i<n;++i){ 36 cin>>a[i]; 37 } 38 sort(a,a+n); 39 for(int i=n-1;i>=0;--i){ 40 sum[n-i]=sum[n-i-1]+a[i]; 41 } 42 for(int i=1;i<=n;++i){ 43 long double tmp=sum[i]/i; 44 if(tmp>=x){ 45 ans=max(ans,i); 46 } 47 } 48 printf("%d\n",ans); 49 } 50 51 52 53 return 0; 54 }
题意:有n个怪物围成一个圈,每次攻击可以对怪物造成一点伤害,当第i个怪物扑街后会对后面一个(n的后面是1)怪物造成b[i]点伤害(如果i+1个怪物存活的话),求最少攻击多少次能将怪物全部消灭
题解:枚举每个怪物受到前一个怪物的阵亡伤害,然后按顺序遍历一边求个最小值就行了(建议用scanf和pritnf,容易T)
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <stack> 7 #include <queue> 8 #include <vector> 9 #include <map> 10 #include <set> 11 #include <unordered_set> 12 #include <unordered_map> 13 #define ll long long 14 #define fi first 15 #define se second 16 #define pb push_back 17 #define me memset 18 const int N = 1e6 + 10; 19 const int mod = 1e9 + 7; 20 using namespace std; 21 typedef pair<int,int> PII; 22 typedef pair<long,long> PLL; 23 24 int t; 25 ll n,a[N],b[N],c[N]; 26 ll sum; 27 ll ans=1e18+10; 28 int main() { 29 scanf("%d",&t); 30 while(t--){ 31 scanf("%lld",&n); 32 ans=1e18+10; 33 sum=0; 34 for(int i=1;i<=n;++i){ 35 scanf("%lld %lld",&a[i],&b[i]); 36 if(i>1) c[i]=max((ll)0,a[i]-b[i-1]); 37 } 38 c[1]=max((ll)0,a[1]-b[n]); 39 if(n==1){ 40 printf("%lld\n",a[1]); 41 continue; 42 } 43 for(int i=1;i<=n;++i){ 44 sum+=c[i]; 45 } 46 for(int i=1;i<=n;++i){ 47 ans=min(ans,a[i]+sum-c[i]); 48 } 49 printf("%lld\n",ans); 50 } 51 52 return 0; 53 }