第六届福建省大学生程序设计竞赛(几道水题)

来源:互联网 发布:数据切片 编辑:程序博客网 时间:2024/05/18 12:02
FZU2212:http://acm.fzu.edu.cn/problem.php?pid=2212

水题

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int map[150];int main(){int T,n,m,temp;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%d",&temp);temp=100-temp;map[i]=temp;}sort(map,map+n);int count=0;for(int i=0;i<n;i++){if(m>=map[i]){count++;m=m-map[i];}else break;}printf("%d\n",count);}return 0;}

FZU2213:http://acm.fzu.edu.cn/problem.php?pid=2213

题意: 给你两个圆的位置和半径,求有多少条同时对两个圆都相切的直线  如果大圆套小圆输出-1

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int main(){int n;double a,b,c,d,e,f;scanf("%d",&n);while(n--){scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f);double x=(a-d)*(a-d);double x1=(b-e)*(b-e);double x2=(double)sqrt(x+x1);if((a==d) &&(b==e) && (c==f) )printf("-1\n");else{if(x2>(c+f))printf("4\n");else if(x2==(c+f))printf("3\n");else if(x2==(max(c,f)-min(f,c)))printf("1\n");else if(x2<(max(c,f)-min(f,c)))printf("0\n");elseprintf("2\n");}}return 0;}
FZU 2214 :http://acm.fzu.edu.cn/problem.php?pid=2214
动态规划 背包问题  
给你个背包,给你最大承重,求最大承重范围内,包内物品的最大价值。

枚举价值:

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;struct node{int W;int V;}nn[1000];int dp[5050];int main(){int t,n;int b;scanf("%d",&t);while(t--){scanf("%d%d",&n,&b);int sum=0;for(int i=0;i<n;i++){scanf("%d%d",&nn[i].W,&nn[i].V);sum=sum+nn[i].V;}for(int i=1;i<=sum;i++)dp[i]=INF;dp[0]=0;for(int i=0;i<n;i++){for(int j=sum;j>=nn[i].V;j--)//枚举价值 {if(dp[j-nn[i].V]!=INF)//存放重量 {dp[j]=min(dp[j],dp[j-nn[i].V]+nn[i].W);//求出来当前价值最小的重量是多少 }}}for(int i=sum;i>=0;i--){if(dp[i]<=b){printf("%d\n",i);break;}}}return 0;}
枚举物品
#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int dp[502][5005]; int w[505];int v[505];int main(){int t,n,m,sum, totalValue;scanf("%d",&t);while(t--){sum=totalValue = 0;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d",&w[i],&v[i]);sum=sum+v[i];}memset(dp,INF,sizeof(dp));dp[0][0]=0;for(int i=1;i<=n;i++){dp[i][0]=0;for(int j=0;j<=sum;j++){if(j>=v[i])dp[i][j]=min(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);elsedp[i][j]=dp[i-1][j];//printf("%d  %d  %d\n",i,j,dp[i][j]);}}for(int i=sum;i>=0;i--){if(dp[n][i]<=m) {totalValue = i;break;}}printf("%d\n", totalValue);}return 0;}

FZU 2216 :http://acm.fzu.edu.cn/problem.php?pid=2216

给你一堆卡牌,然后给你几张王牌(可以作为1-m的任何一张卡),求递增的连续序列的最长长度

#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int tt[100005];int tt1[100005];int main(){int t,n,m,zero,temp;scanf("%d",&t);while(t--){memset(tt,0,sizeof(tt));zero=0;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%d",&temp);if(temp==0)zero++;else{tt[temp]=1;}}tt1[0]=0;for(int i=1;i<=m;i++)//看看i-m每个点之前需要有多少0 {if(tt[i])tt1[i]=tt1[i-1];//需要0的个数 elsett1[i]=tt1[i-1]+1;}int MAX=0; for(int i=0;i<=m;i++)//2分 {int l=i;int r=m;int mid;while(l<=r){mid=(l+r)/2;if(tt1[mid]-tt1[i]>zero)r=mid-1;elsel=mid+1;}MAX=max(MAX,r-i);//自我体会 mid 和 r 的差别}printf("%d\n",MAX);}return 0;}

FZU 2221 :http://acm.fzu.edu.cn/problem.php?pid=2221

就是两边群殴,只要你人多就赢, 如果相同 RUN MAN win 
如果有极端大 肯定会有极端小 这样不是最优的 
最优的是均分,只要和比最小的两个的和大2就说明肯定能赢。
#include<stdio.h>#include<iostream> #include <algorithm>#include<string.h>#include<vector>#include<math.h>#include<queue>#include<deque>#include<set>#define ll long long#define INF 0x3f3f3f3fconst int  mod = 1e9+7;using namespace std;int KGCD(int a,int b){if(a==0)return b;if(b==0)return a;if(~a&1){ if(b&1) return KGCD(a>>1,b);else return KGCD(a>>1,b>>1) <<1; } if(~b & 1)  return KGCD(a, b>>1);  if(a > b) return KGCD((a-b)>>1, b);return KGCD((b-a)>>1, a);}  int LCM(int a,int b){ return a/KGCD(a,b)*b; } inline ll qpow(ll n,ll m){n%=mod;ll ans=1;while(m){if(m%2) ans=(ans*n)%mod;m/=2;n=(n*n)%mod;}return ans;}inline ll inv(ll b){return b==1?1:(mod-mod/b)*inv(mod%b)%mod;}inline ll inv2(ll b){return qpow(b,mod-2);}int dir[5][2]={0,1,0,-1,1,0,-1,0};using namespace std;int main(){int n;int a,b,sum;scanf("%d",&n);while(n--){scanf("%d%d",&a,&b);int w=a/3;int c=a%3;if(c==2)sum=w+w+1;elsesum=w+w;sum=sum+2;if(sum > b)printf("Yes\n");elseprintf("No\n"); }return 0; }



阅读全文
0 0
原创粉丝点击